Как вернуть только 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, чтобы очистить ваш вид.