Невозможно присвоить теги правильному посту через сериализацию с помощью Django Rest Framework

Я пытаюсь сериализовать модель Tag для моего проекта DRF (Django Rest Framework) - но почему-то я не смог назначить теги заголовку конкретного поста при отправке JSON на конечную точку API. Вместо того, чтобы увидеть правильный заголовок поста, обозначенный соответствующими тегами, я вижу следующее:

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "tag id": "9",
        "post title": "No post title found!",
        "slug": "test-999",
        "post id": [],
        "tag": "test 999"
    }
]

Моя модель тега:

class PostTag(models.Model):
    tag = models.CharField(max_length=50, blank=True)
    slug = models.SlugField(max_length=255, unique=True)
    posts = models.ManyToManyField(Post, related_name='post_tag', through='role')

    def __str__(self):
        return self.tag

Мой serializers.py:

class TagsieSerializer(serializers.ModelSerializer):
    # posts = serializers.StringRelatedField(many=True, read_only=True)

    class Meta:
        model = PostTag
        fields = '__all__'

    def to_representation(self, instance):
        """
        Customizing how serialization of each tag should be displayed.
        This is possible due to overriding to_representation method.
        :param instance:
        :return:
        """
        data = super(TagsieSerializer, self).to_representation(instance)
        for val in [data]:
            tag_id = str(val['id'])
            tag = val['tag']
            slug = val['slug']
            post_id = val['posts']
            post_title_list = []
            new_post_title_list = []
            try:
                # Getting post title - but for some strange reason ValueError occurs and yet result returns
                # fine if I catch it and append it inside a list.  This is why I'm using try/except.
                post_title = Post.objects.filter(pk=int(re.sub(r'[^a-zA-Z0-9]', "", str(post_id))))
                post_title_list.append(post_title)
            except ValueError:
                pass
            try:
                for i in post_title_list[0]:
                    new_post_title_list.append(i)
            except IndexError:
                new_post_title_list.append('No post title found!')
            # print(new_post_title_list[0])
            return {'tag id': tag_id, 'post title': str(new_post_title_list[0]), 'slug': slug, 'post id': post_id,
                    'tag': tag}

Нужно ли мне переопределять create()? Если да, то что мне делать? Я пытался, но не смог. Это было очень странно!

OK, я разобрался с этим! Я получил эти две модели, связанные с тегами:

from django.db import models
from post.models import Post


# Create your models here.
class PostTag(models.Model):
    tag = models.CharField(max_length=50, blank=True)
    slug = models.SlugField(max_length=255, unique=True)
    posts = models.ManyToManyField(Post, related_name='post_tag', through='roletag')

    def __str__(self):
        return self.tag


class RoleTag(models.Model):
    role_name = models.CharField(max_length=50)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    posttag = models.ForeignKey(PostTag, on_delete=models.CASCADE)

    def __str__(self):
        return self.role_name

Потому что я назначил RoleTag как способ присвоения тега к посту. Вот почему сериализация модели PostTag не могла играть роль RoleTag для назначения тегов постам. После того, как я сериализовал модель RoleTag - теперь я могу использовать RoleTag для назначения тега к посту.

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