Почему не отображается мое поле сериализатора?

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Прямо сейчас у меня нет проблем с отображением выходных данных полей.Но почему-то я не вижу вывода postlikes_set в выводе json. Я не получаю никаких ошибок или чего-то в этом роде, я просто не вижу этого. Я не знаю почему. Кто-нибудь знает проблему? Вот мои коды.

Модель

 class Article(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User,on_delete=models.CASCADE,related_name='articles')
    caption = models.CharField(max_length=250)


class LikePostModel(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User, unique=True, on_delete=models.CASCADE,related_name='postlikes',null=True)
    article = models.ForeignKey(Article,  on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now=True)
 

Сериализатор

 class LikePostViewSerializer(serializers.ModelSerializer):

    class Meta:
        model = LikePostModel
        fields = ('id',"author","article")

class ArticleViewSerializer(serializers.ModelSerializer):
    images_set = ArticleImageViewSerializer(source='images',required=False,many=True)
    comments_set = CommentViewSerializer(source='comments',required=False,many=True)
    postlikes_set = LikePostViewSerializer(source='postlikes',required=False,many=True)

    class Meta:
        model = Article
        fields = ('id','caption','images_set','comments_set','postlikes_set')

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

Вывод

 [
    {
        "id": "092e929f-c845-403d-8373-84c745140c11",
        "caption": "caption",
        "images_set": [],
        "comments_set": []
    }
]
 

Комментарии:

1. Можете ли вы объяснить source='postlikes' ? Похоже, вы пытаетесь получить доступ к одному полю, когда вам следует обратиться к модели. Также вам не нужно переопределять метод create(), если вы ничего в нем не меняете.

2. «постлайки» имеют ту же эффективность, что и «комментарии». Когда я удаляю «комментарии», комментарии не отображаются. метод create() сейчас является наименее приоритетным.

3. Можете ли вы добавить модель статьи?

4. добавил его. Вы можете взглянуть на это.

5. Не могли бы вы взглянуть на мой ответ и посмотреть, решит ли это вашу проблему?

Ответ №1:

Вы пытаетесь получить доступ к полю вашей модели LikePostModel, когда ваша модель сериализатора является Article . Разница с «комментариями» заключается в том, что оно ссылается на поле вашей модели статьи.

Теперь я не знаю точно, какой JSON вы ожидаете, но это выведет поле author (он же postlikes) вашего LikePostModel внутри его сериализатора.

 #models.py
class LikePostModel(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User, unique=True, on_delete=models.CASCADE,related_name='postlikes',null=True)
    article = models.ForeignKey(Article,  on_delete=models.CASCADE, related_name='postlikes_set')
    created = models.DateTimeField(auto_now=True)

# serializers.py
class LikePostViewSerializer(serializers.ModelSerializer):

    class Meta:
        model = LikePostModel
        fields = ('id',"author","article")

class ArticleViewSerializer(serializers.ModelSerializer):
    images_set = ArticleImageViewSerializer(source='images',required=False,many=True)
    comments_set = CommentViewSerializer(source='comments',required=False,many=True)
    postlikes_set = LikePostViewSerializer(required=False,many=True)

    class Meta:
        model = Article
        fields = ('id','caption','images_set','comments_set','postlikes_set')

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

Комментарии:

1. Я уже пробовал это раньше. Все еще не работает.

2. Я изменил поле статьи LikePostModel в вашем models.py . Вы можете посмотреть на это?

3. Нет проблем, всегда думайте о том, какой моделью является ваш сериализатор, и когда вы хотите использовать обратные отношения, лучше всего установить related_name в вашем объекте ForeignKey.

4. Я уже проявляю осторожность при поиске related_name, но установка имени источника в сериализаторах всегда срабатывала. Думаю, это требовало дополнительной осторожности.