Невозможно успешно передать ссылку foreign_key в запрос PUT в Django REST

Я начинаю изучать Django REST и пытаюсь использовать его для бэкенда типа криптовалютного трекера для моего использования. Однако я застрял на проблеме в течение нескольких дней...

У меня есть следующий models.py:

class Coin(models.Model):
    sign = models.CharField(max_length=50, primary_key=True)    # capitalize all entries
    name = models.CharField(max_length=50, null=False)
    amount = models.DecimalField(max_digits=20, decimal_places=2, null=False)
    price_each = models.DecimalField(max_digits=20, decimal_places=2, null=False)
    purchased_on = models.DateField(null=True)

    def __str__(self):
        return self.sign

    def save(self, *args, **kwargs):
        self.sign = self.sign.upper()
        return super(Coin, self).save(*args, **kwargs)

class Price(models.Model):
    coin = models.ForeignKey(Coin, related_name="prices", on_delete=models.CASCADE)
    day_date = models.DateField(null=False)
    current_price = models.DecimalField(max_digits=20, decimal_places=2, null=False)

    def __str__(self):
        timestamp = self.day_date.strftime("%d-%b-%Y")

        return timestamp

и serializers.py:

class PriceSerializer(serializers.ModelSerializer):
    coin_sign = serializers.PrimaryKeyRelatedField(queryset=Coin.objects.all(), source='coin.sign')

    class Meta:
        model = Price
        fields = ['id', 'day_date', 'current_price', 'coin_sign']
    
    def create(self, validated_data):
        return Price.objects.create(**validated_data)


class CoinSerializer(serializers.ModelSerializer):
    prices = PriceSerializer(many=True, read_only=False)

    class Meta:
        model = Coin
        fields = ['sign', 'name', 'amount', 'price_each', 'purchased_on', 'prices']

    def create(self, validated_data):
        return Coin.objects.create(**validated_data)

У меня проблемы с определением представления с PUT для создания нового ценового входа в view.py:

class AddPrice(APIView):
    def put(self, request, sign, format=None):
        coin = get_object_or_404(Coin, sign=sign.upper())
        request.data['coin_sign'] = coin
        serializer = PriceSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Вот URL, по которому я пытаюсь попасть в конечную точку PUT: http://127.0.0.1:8000/crypto/coins/cro/add_price/ со следующим телом: { "day_date": "2021-12-04", "current_price": "420.69" }

и urlpattern из my_app/urls.py:

path('', views.index, name='index'),    # http://127.0.0.1:8000/crypto/
path('coins/', views.Coins.as_view(), name='all_coins'),
path('coins/<str:sign>/', views.CoinInfo.as_view(), name='coin_info'),
path('coins/<str:sign>/add_price/', views.AddPrice.as_view(), name='add_price'),

Я понимаю, что передаю представление объекта вместо реального объекта, и из-за этого я не могу правильно связать цену с монетой:

Cannot assign "{'sign': <Coin: CRO>}": "Price.coin" must be a "Coin" instance.

Как мне успешно создать объект Price из конечной точки?

Спасибо, что читаете!

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