【问题标题】:Django search_fields foreign key not working as expectedDjango search_fields 外键未按预期工作
【发布时间】:2020-01-26 13:37:24
【问题描述】:

我正在使用 django_rest_api_framework。我需要搜索外键。我的搜索字段是“customer_id”

views.py 文件

class DebtListAPIView(ListAPIView):
    serializer_class = DebtCreateSerializer
    permission_classes = [IsOwner]

    filter_backends = [SearchFilter]
    list_display = ('customer_id',)
    search_fields = ["customer_id__id"]

    def get_queryset(self):
        queryset = Debt.objects.filter()
        return queryset

serializers.py 文件

class DebtCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Debt
        fields = ['id', 'user', 'customer', 'debtKey', 'created_userKey', 'total_Debt', 'received_Amount',
                  'payment_Date', 'description', ]

models.py

class Debt(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, default=0,
                             blank=False)    
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, blank=False,
                                 related_name='customer')  
    debtKey = models.UUIDField(editable=False, default=uuid.uuid4,
                               blank=False)
    created_userKey = models.UUIDField(editable=False,
                                       default=uuid.uuid4)
    total_Debt = models.CharField(max_length=50, blank=False)
    received_Amount = models.CharField(max_length=50, blank=True)
    payment_Date = models.DateField(blank=True)
    description = models.CharField(max_length=500, blank=True)

    created_Date = models.DateTimeField(auto_now=True)
    modified_Date = models.DateTimeField(auto_now=True)

【问题讨论】:

    标签: django django-models django-rest-framework django-views


    【解决方案1】:

    您的字段名为customer,而不是customer_id

    另外,我认为默认的DjangoFilterBackend 可能比SearchFilter 更合适,因为SearchFilter 用于字符串搜索查询,例如客户姓名。

    我认为您从 Admin 类复制了(部分)这段代码,因为 list_display 也不对 APIViews 执行任何操作。

    将你的views.py更改为:

    class DebtListAPIView(ListAPIView):
        serializer_class = DebtCreateSerializer
        permission_classes = [IsOwner]
    
        filter_backends = [DjangoFilterBackend]
        filter_fields = ["customer__id"]
    
        def get_queryset(self):
            queryset = Debt.objects.filter()
            return queryset
    

    我注意到的另一件事是您使用混合大小写的变量,例如 payment_Datecreated_userKeydebtKey。变量的python命名约定只有下划线,没有大写,所以你应该考虑将其更改为payment_datecreated_user_keydebt_key

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-19
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 2012-08-14
      • 2020-12-02
      相关资源
      最近更新 更多