Django使用.set添加多个与m2m相关的模型记录,效果很好,但是如何还添加除id之外的其他模型字段?

问题描述 投票:0回答:2

我具有通过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_idphototags字段。

但是,phototags模型中除了相关模型的ID外,我还想同时填充其他字段,例如created dateuser_id,以记录谁建立了关系以及何时建立关系。

填充这些其他列的最佳方法是什么?

[我唯一能想到的是不使用.set并遍历标签ID列表并手动创建phototag记录,但随后我失去了m2m的优势,避免了将标签重复分配给照片等。

django python-3.x
2个回答
1
投票

您可以使用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']

0
投票

[我刚刚在Django文档中找到了through_defaults,将其添加到.set()中,这使我默认user_idteam_id用于分配给照片的所有标签,而这正是我想要的。

在我的用例中看起来像这样:

photo.tags.set(form_tags_ids, through_defaults={'user_id': request.user.id, 'team_id': team.id})

但是这似乎是Django 2.2的新功能

© www.soinside.com 2019 - 2024. All rights reserved.