Как опубликовать внешний ключ, используя в качестве фактического имя поля, а не значение pk
Я все еще новичок в django и я пытаюсь опубликовать номер rfid и номер регистрации автобуса и я получаю следующую ошибку:
Ошибка: {"status": "error", "data":{"rfid":["Неверный тип. Ожидаемое значение pk, получено str."], "bus":["Неверный тип. Ожидаемое значение pk, получено str."]}}
Я хотел бы опубликовать фактический номер rfid и номер bus reg вместо значения pk. Есть ли способ добиться этого.
Модель сделки:
class Transaction(models.Model):
bus = models.ForeignKey(Bus, on_delete = models.CASCADE)
rfid = models.ForeignKey(Rfid, on_delete = models.CASCADE)
date = models.DateTimeField(default=timezone.now)
updated = models.DateTimeField(auto_now = True)
created = models.DateTimeField(auto_now_add = True)
Serializer:
class TransactionSerializer(serializers.ModelSerializer):
class Meta:
model = Transaction
fields = ('rfid', 'bus')
views.py:
class TransactionViews(APIView):
def post(self, request):
serializer = TransactionSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({"status": "success", "data": serializer.data},
status=status.HTTP_200_OK)
else:
return Response({"status": "error", "data": serializer.errors},
status=status.HTTP_400_BAD_REQUEST)
rfid модель:
class Rfid(models.Model):
rfid_num = models.CharField(max_length = 50, unique = True)
lock = models.BooleanField(choices = BOOL_CHOICES, default = False, verbose_name = 'Lock card', blank=True)
is_active = models.BooleanField(default = True)
user = models.OneToOneField(User, on_delete = models.CASCADE)
balance = models.PositiveIntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
модель автобуса:
class Bus(models.Model):
reg_num = models.CharField(max_length = 20, unique = True)
destination = models.ForeignKey(Destination, on_delete = models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
company = models.ForeignKey(Company, on_delete = models.CASCADE)
Как гласит ошибка, request.data имеет строковое представление первичных ключей rfid и bus.
Error: {"status":"error","data":{"rfid":["Incorrect type. Expected pk value, received str."],"bus":["Incorrect type. Expected pk value, received str."]}}
Проверьте, какой словарь request.data возвращается в вашем views.py и попробуйте преобразовать первичные ключи в целочисленные значения, прежде чем передавать их вашему объекту сериализатора.
class TransactionViews(APIView):
def post(self, request):
print(request.data)
data = request.data
data['rfid'] = int(data['rfid'])
data['bus'] = int(data['bus'])
serializer = TransactionSerializer(data=data)