добавление к множеству полей в джанго - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь сохранить поле «многие ко многим тегам» при создании сообщения.

это мой запрос на создание нового сообщения

{
"name":"testpost1",
"caption":"test caption n",
"tags":[{"name":"tag1"}]
}

Модель

class Tags(models.Model):
    id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
    name = models.CharField(max_length=50, unique=True)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="created_tags")
    time_created = models.DateTimeField(auto_now_add=True)
    followers = models.ManyToManyField(User, related_name="following_tags")
    posts = models.ManyToManyField('Posts', related_name='tags', symmetrical=True)


class Posts(models.Model):
    id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
    name = models.CharField(max_length=50)
    caption = models.TextField(max_length=1000)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')

Сериализатор для Post и тега

class TagsSerializerMini(serializers.ModelSerializer):

    class Meta:
        model = Tags
        fields = ('name', )

class PostsSerializer(QueryFieldsMixin, serializers.ModelSerializer):
    created_by = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())
    tags = TagsSerializerMini(many=True, required=False)

    class Meta:
        model = Posts
        fields = ('id', 'name', 'caption', 'tags', 'num_reactions', 'num_comments', 'created_by',  'posted_time',
                  'updated_time', )
        read_only_fields = ('id', 'posted_time', 'updated_time', )

    def create(self, validated_data):
        tags_data = validated_data.pop('tags', [])
        post = Posts.objects.create(**validated_data)
        for tag in tags_data:
            t, _ = Tags.objects.get_or_create(name=tag["name"], created_by=self.context['request'].user)
            t.posts.add(post)
        return post

Теперь проблема в том, что, когда я добавляю сообщение в тег t.posts.add(post), оно выдает ошибку django.db.utils.IntegrityError: FOREIGN KEY constraint failed. Я также попытался добавить сообщение из оболочки, которое выдает ту же ошибку.

1 Ответ

0 голосов
/ 15 марта 2019

У меня возникла похожая проблема, и я решил ее с помощью промежуточной модели (используя through), вот как должен выглядеть ваш код:

models.py:

class Tags(models.Model):
    # ...
    posts = models.ManyToManyField('Posts', related_name='tags', symmetrical=True, through='PostsTag')


class PostTag(models.Model):
    tag = models.ForeignKey(Tags)
    post = models.ForeignKey(Posts)

сериализатору:

# ...
def create(self, validated_data):
    tags_data = validated_data.pop('tags', [])
    post = Posts.objects.create(**validated_data)
    for tag in tags_data:
        t, _ = Tags.objects.get_or_create(name=tag["name"], created_by=self.context['request'].user)
        PostTag.objects.create(tag=t, post=post)  # <----- Create m2m relation
    return post

Примечание: я не тестировал код, но надеюсь, что это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...