django - 添加到 django 中的多线程字段
问题描述
创建帖子时,我正在尝试保存多对多标签字段。
这是我创建新帖子的帖子请求
{
"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 和 tag 的序列化程序
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
。我也尝试从 shell 添加一个帖子,它给出了同样的错误。
解决方案
我遇到了类似的问题,我通过使用中间模型(使用through
)解决了它,这是您的代码的外观:
模型.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
注意:我没有测试代码,但希望这会有所帮助!
推荐阅读
- scala - Scala Spark-使用Array [String]进行GroupBy匹配记录(如果包含在其他记录元素中作为列表)
- java - TimerTask 和 Timer:实例变量的行为
- apigee - 我希望 Apigee 中的代理每 1 分钟调用一次
- search - 按用户访问权限搜索 Gerrit 更改
- java - 将类与相同类型关联
- docker - 什么是从一个容器到另一个容器的 url 服务?
- angular - 如何根据条件禁用 Mat-tree 组件?
- unit-testing - 使用 jasmine / spyOn 模拟对象的属性
- javascript - 从父级或最近的 div 获取数据值
- java - 如何在 Java 8 中将字符串(例如“01/01/2019”)转换为日期