代码之家  ›  专栏  ›  技术社区  ›  Kishor Pawar

DRF:相关字段名引发错误列定义不明确

  •  0
  • Kishor Pawar  · 技术社区  · 8 年前

    我有这样的模型

    class Profile(models.Model):
        id = models.BigIntegerField(primary_key=True)
        name = models.CharField(max_length=1024, blank=True, null=True)
    
        class Meta:
             managed = False 
    
    class ResourceMgmt(models.Model):
        id = models.BigIntegerField(primary_key=True)
        profile = models.ForeignKey(Profile, models.DO_NOTHING, related_name='cpe_mgmt_profile')
    
        class Meta:
            managed = False
    

    类似序列化程序

    class ResourceMgmtSerializer(serializers.ModelSerializer):
        profile_name = serializers.StringRelatedField(source='profile.name', read_only=True)
    
        class Meta:
            model = ResourceMgmt
            fields = (<tuple of fields including profile_name>)
    

    类似视图

    class RunningSchedules(generics.ListCreateAPIView):
    
        serializer_class = ResourceMgmtSerializer
        model = ResourceMgmt
        filter_backends = (filters.OrderingFilter, filters.SearchFilter,)
        ordering_fields = (<tuple of fields including profile_name as profile__name>)
        ordering = ('-schedule_start_time',)
        search_fields = ordering_fields
    

    现在当我点击url时 ?ordering=profile__name 我出错了 ORA-00918: column ambiguously defined . 我知道这是什么错误,但似乎无法理解为什么Django ORM会出现这种情况

    更新:

    这是一个错误 fixed 在Django中==1.8,但我找到了 在Django中==1.10。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Kishor Pawar    8 年前

    好啊当我重新打开 ticket here Django开发者(Simon Charette)给了一个指针,结果是我的 get_queryset 是罪魁祸首。

    错误的查询是

    ResourceMgmt.objects.filter(is_active='Y')\
        .filter(schedule_next_run_time__lt=future)\ # future is calculated date
        .filter(schedule_end_time__gt=now + datetime.timedelta(minutes=1))\
        .extra(where=["schedule_next_run_time > sysdate - (schedule_frequency/1440)",
                     "owner_id IN ( \
                      select id from cpe_user \
                      where is_active='Y' \
                      connect by prior id = parent_id start with id = % s)"], 154)
    

    固定查询为

    ResourceMgmt.objects.filter(is_active='Y')\
        .filter(schedule_next_run_time__lt=future)\ # future is calculated date
        .filter(schedule_end_time__gt=now + datetime.timedelta(minutes=1))\
        .extra(where=["schedule_next_run_time > sysdate - (schedule_frequency/1440)",
                     "cpe_resource_mgmt.owner_id IN ( \ ### look at this line.
                      select id from cpe_user \
                      where is_active='Y' \
                      connect by prior id = parent_id start with id = % s)"], 154)
    

    正如Oracle error所说, column ambiguously defined ,它实际上意味着 owner_id 在里面 extra 条款