Невозможно присвоить теги правильному посту через сериализацию с помощью 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 для назначения тега к посту.