我具有通过photos
模型具有m2m关系的tags
模型和phototags
模型。
class Photo(models.Model):
tags = models.ManyToManyField(Tag, through = 'PhotoTag', related_name="tags")
在视图中,我创建了一个标签ID列表,我在photo.tags.set(form_tags_ids)
中使用该标签ID来创建新的phototag
关系。这可以正常工作,并且可以成功填充photo_id
模型中的tag_id
和phototags
字段。
但是,phototags
模型中除了相关模型的ID外,我还想同时填充其他字段,例如created date
,user_id
,以记录谁建立了关系以及何时建立关系。
填充这些其他列的最佳方法是什么?
[我唯一能想到的是不使用.set
并遍历标签ID列表并手动创建phototag
记录,但随后我失去了m2m的优势,避免了将标签重复分配给照片等。
您可以使用bulk_create
方法。您可以在每个对象创建中添加所有其他参数,如下所示:
PhotoTag.objects.bulk_create([
PhotoTag(photo=photo_id1, tag=tag1, created_date=datetime.now(), user_id=75),
PhotoTag(photo=photo_id2, tag=tag2, created_date=datetime.now(), user_id=75),
PhotoTag(photo=photo_id3, tag=tag3, created_date=datetime.now(), user_id=75),
])
此外,您可以在模型关系上添加unique_together
,以避免重复分配。
class PhotoTag(models.Model):
photo = ...
tag = ...
class Meta:
unique_together = ['photo', 'tag']
[我刚刚在Django文档中找到了through_defaults
,将其添加到.set()
中,这使我默认user_id
和team_id
用于分配给照片的所有标签,而这正是我想要的。
在我的用例中看起来像这样:
photo.tags.set(form_tags_ids, through_defaults={'user_id': request.user.id, 'team_id': team.id})
但是这似乎是Django 2.2的新功能