Пытаюсь получить имя вместо первичного ключа, но DRF сообщает об ошибке значения. Если я пытаюсь исправить это, я получаю и другие ошибки

Мои модели:

  def upload_to(instance, filename):
    return 'images/{filename}'.format(filename=filename)

  class StreamPlatform(models.Model):
    name = models.CharField(max_length=200)
    about = models.TextField(max_length=2000)
    website = models.URLField(max_length=2500)
  
    def __str__(self):
      return self.name

  class WatchList(models.Model):
    title = models.CharField(max_length=250)
    image = models.ImageField(_('Image'), upload_to=upload_to, default='images/default.jpg')
    storyline = models.TextField(max_length=2000)
    platform = models.ForeignKey(StreamPlatform, on_delete=models.CASCADE, related_name='watchlist')
    active = models.BooleanField(default=True)
    avg_rating = models.FloatField(default=0)
    number_rating = models.IntegerField(default=0)
    created = models.DateTimeField(auto_now_add=True)
  
    def __str__(self):
     return self.title

Мои сериализаторы:

class WatchListSerializer(serializers.ModelSerializer):
  platform = serializers.CharField(source='platform.name')
  class Meta:
    model = WatchList
    fields = '__all__'
    extra_kwargs = {'avg_rating': {'read_only': True}, 'number_rating': {'read_only': True}}
  def create(self, validated_data):
    return WatchList.objects.create(**validated_data)

class StreamPlatformSerializer(serializers.ModelSerializer):
  watchlist = WatchListSerializer(many=True, read_only=True)
  class Meta:
    model = StreamPlatform
    fields = '__all__'

Мое мнение:

class WatchListAV(generics.ListCreateAPIView):
  permission_classes = [AdminOrReadOnly]
  parser_classes = [MultiPartParser, FormParser]
  queryset = WatchList.objects.all()
  serializer_class = WatchListSerializer
  pagination_class = WatchListLimitOffsetPagination
  filter_backends = [filters.SearchFilter, filters.OrderingFilter]
  search_fields = ['title', 'platform__name']
  ordering_fields = ['avg_rating']

Проблема, с которой я столкнулся, заключается в том, что Django Rest Framework жалуется в PostMan, что: ValueError at /watch/list/ Cannot assign "{'name': '8'}": "WatchList.platform" должен быть экземпляром "StreamPlatform"

Когда я пытаюсь исправить это в WatchListSerializer:

platform = serializers.PrimaryKeyRelatedField(queryset = StreamPlatform.objects.all(), source='platform.name',)

Вместо этого я получил новую ошибку: ValueError at /watch/list/ Невозможно присвоить "{'name': <StreamPlatform: Blah>}": "WatchList.platform" должен быть экземпляром "StreamPlatform".

Когда я закомментировал биты кода, допускающие ошибки, я получил правильный ответ, но не тот ответ, на который я надеялся.

{
"id": 26,
"title": "Awesome Show Blah Blah",
"image": "http://127.0.0.1:8000/media/images/default.jpg",
"storyline": "Any blah...",
"active": true,
"avg_rating": 0.0,
"number_rating": 0,
"created": "2022-05-12T17:04:04.151048Z",
"platform": 8

}

Я надеюсь, что "platform": 8 будет отображаться в имени как "platform": Blah. Так как это исправить?

Вы можете использовать SlugRelatedField.

class WatchListSerializer(serializers.ModelSerializer):
    platform = serializers.SlugRelatedField(many=True, read_only=True, slug_field='name')
    class Meta:
        model = WatchList
        fields = '__all__'
        extra_kwargs = {
            'avg_rating': {'read_only': True}, 
            'number_rating': {'read_only': True}
        }
    def create(self, validated_data):
        return WatchList.objects.create(**validated_data)
Вернуться на верх