Внешний ключ Django search_fields не работает должным образом - PullRequest
0 голосов
/ 26 сентября 2019

Я использую 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)

1 Ответ

1 голос
/ 26 сентября 2019

Ваше поле называется 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_Date, created_userKey и debtKey.Соглашение об именах переменных для Python - это только подчеркивание, без заглавных букв, поэтому вы должны изменить это значение на payment_date, created_user_key и debt_key.

...