Home > database >  How do I pull in data from multiple models into a specific model serializer?
How do I pull in data from multiple models into a specific model serializer?

Time:01-11

I have this model that represents a bookmark or favorite. It has multiple foreign keys to other models. In the api I would like to pull in the data from each of the models that is referenced in the particular bookmark.

The model:

class Bookmark(models.Model):
    marktype = models.CharField(max_length=10)
    post = models.OneToOneField(Post, on_delete=models.CASCADE, null=True, blank=True)
    question = models.OneToOneField(Question, on_delete=models.CASCADE, null=True, blank=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="created at")
    updated_at = models.DateTimeField(auto_now=True, verbose_name="updated at")

    class Meta:
        verbose_name = "bookmark"
        verbose_name_plural = "bookmarks"
        ordering = ["created_at"]
        db_table = "bookmarks"

    def __str__(self):
        return "{}'s bookmark".format(self.owner.username)

I tried to use a SerializerMethodField but I get an error: 'NoneType' object has no attribute 'id'

Here is the serializer

class BookmarkSerializer(serializers.ModelSerializer):
    post = serializers.SerializerMethodField()
    question = serializers.SerializerMethodField()

    class Meta:
        model = Bookmark
        fields = '__all__'

    def get_post(self, obj):
        obj = Post.objects.get(id=obj.post.id)
        post = ShortPostSerializer(obj)
        return post.data

    def get_question(self, obj):
        obj = Question.objects.get(id=obj.question.id)
        question = ShortQuestionSerializer(obj)
        return question.data

what am I doing wrong please?

CodePudding user response:

You can update your serializer like the following (You can short it as you want or use your ShortQuestionSerializer as well instead of QuestionSerializer),

class QuestionSerializer(serializers.ModelSerializer):

    class Meta:
        model = Question
        fields = '__all__'

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post
        fields = '__all__'

class BookmarkSerializer(serializers.ModelSerializer):
    post = PostSerializer()
    question = QuestionSerializer()

    class Meta:
        model = Bookmark
        fields = '__all__'
  • Related