У меня 3 модели: Post
, Topic
, PostTopic
. PostTopic
содержит все темы, связанные с Post
. Модели выглядят так:
class Topic(models.Model):
name = models.CharField(max_length=25, unique=True)
def save(self, *args, **kwargs):
topic = Topic.objects.filter(name=self.name)
if topic:
return topic[0].id
super(Topic, self).save(*args, **kwargs)
return self.id
class PostTopic(models.Model):
topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
post= models.ForeignKey(Post, on_delete=models.CASCADE)
Модель Topic
не может иметь 2 одинаковых тем. Вот как выглядит мой сериализатор:
class PostSerializer(serializers.ModelSerializer):
topics = serializers.ListField(
child=serializers.CharField(max_length=256), max_length=3
)
class Meta:
model = Post
fields = ('user', 'status', 'topics')
def create(self, validated_data):
topics= validated_data.pop('topics')
post = Post.objects.create(**validated_data)
for topic in topics:
topic_id = Topic(name=topic).save()
PostTopic(post_id=post.id, topic_id=topic_id).save()
return post
Однако я получаю сообщение об ошибке:
Получил AttributeError при попытке получить значение для поля topics
на сериализаторе PostSerializer
. Поле сериализатора может иметь неправильное имя и не соответствовать ни одному атрибуту или ключу в экземпляре Post
.
Я понимаю, что делаю неправильно, но не уверен, как это исправить где я могу сохранить топи c в PostTopic
тоже. Есть ли лучший способ сделать это?