Как вернуть только 1 (единственную) запись через Django Rest Framework API? (проблема с many=False)

У меня есть простой Django Rest Framework API, который я хотел бы возвращать только 1 запись. Однако, когда я устанавливаю many=False, это больше не работает. Как я могу это исправить?

Вот API: (сериализатор и модель ниже)

class Expense_View_API(APIView):
    permission_classes = [IsAuthenticated, ]

    def get(self, request):

        param_xid = request.GET.get('id','')

        if param_xid != "":
            expenses_recordset = Expenses.objects.filter(xid=param_xid)
            serializer = Expenses_Serializer(expenses_recordset, many=True)
            return Response(serializer.data, status=status.HTTP_200_OK)

        else:
            return Response("BAD REQUEST: Missing 'id' Parameter", status=status.HTTP_400_BAD_REQUEST)

Выдает: (хорошо, за исключением того, что мне не нужны квадратные скобки списка)

[
    {
        "xid": 111,
        "xdate": "2021-02-15T00:00:00Z",
        "xseller": "Amazon",
        "xamount": "30.00",
    }
]

Проблема: Когда я устанавливаю serializer = Expenses_Serializer(expenses_recordset, many=False), он теперь возвращает эти нулевые данные и отбрасывает мое поле xid. Почему?

{
    "xdate": null,
    "xseller": null,
    "xamount": null,
}

Я хочу, чтобы оно вернулось:

{
    "xid": 111
    "xdate": "2021-02-15T00:00:00Z",
    "xseller": "Amazon",
    "xamount": "30.00",
}

Вот мой сериализатор и модель данных:

class Expenses_Serializer(serializers.ModelSerializer):

    class Meta:
        model = Expenses
        fields = ('xid', 'xdate', 'xseller', 'xamount')


class Expenses(models.Model):
    xid = models.AutoField(db_column='xID', primary_key=True)  # Field name made lowercase.
    xdate = models.DateTimeField(db_column='xDate', blank=True, null=True)  # Field name made lowercase.
    xseller = models.CharField(db_column='xSeller', max_length=50, blank=True, null=True)  # Field name made lowercase.
    xamount = models.DecimalField(db_column='xAmount', max_digits=19, decimal_places=2, blank=True, null=True)  # Field name made lowercase.

    # Metadata
    class Meta:
        managed = False
        db_table = 'Expenses'
        app_label  = 'Expenses'

    # Methods
    def get_absolute_url(self):
        """Returns the url to access a particular instance of MyModelName."""
        return reverse('model-detail-view', args=[str(self.id)])

    def __str__(self):
        """String for representing the MyModelName object (in Admin site etc.)."""
        return self.my_field_name

Спасибо за ваше время!

Проблема в том, что вы сериализуете целый QuerySet(список), используя API фильтра. Вместо этого вы хотите сериализовать один экземпляр объекта:

class Expense_View_API(APIView):
    permission_classes = [IsAuthenticated, ]

    def get(self, request):

        param_xid = request.GET.get('id','')

        if param_xid != "":
            expense_recordset = Expenses.objects.get(xid=param_xid)
            serializer = Expenses_Serializer(expense_recordset)
            return Response(serializer.data, status=status.HTTP_200_OK)

        else:
            return Response("BAD REQUEST: Missing 'id' Parameter", status=status.HTTP_400_BAD_REQUEST)

Также я рекомендую использовать ярлык get_object_or_404, чтобы очистить ваш вид.

Вернуться на верх