Django добавляет несколько связанных с м2 записей модели, используя .set, работает нормально, но как также добавить дополнительные поля модели, кроме идентификаторов? - PullRequest
0 голосов
/ 02 декабря 2019

У меня есть photos модель и tags модель с отношением m2m к phototags модели.

class Photo(models.Model):
    tags = models.ManyToManyField(Tag, through = 'PhotoTag', related_name="tags")

В представлении я создаю список идентификаторов тегов, которые я использую в photo.tags.set(form_tags_ids) длясоздать новые phototag отношения. Это работает нормально и успешно заполняет поля photo_id и tag_id в модели phototags.

Однако у меня также есть другие дополнительные поля в модели phototags, кроме идентификаторов связанных моделей, которыеЯ хочу заполнить одновременно, например, created date, user_id, чтобы записать, кто установил отношения и когда они были созданы.

Каков наилучший способ заполнить эти другие столбцы?

Единственное, о чем я могу думать, - это не использовать .set, обходить список идентификаторов тегов и вручную создавать phototag записей, но тогда я теряю преимущество m2m во избежании дублирования присвоения тега фотографии и т. Д.

Ответы [ 2 ]

1 голос
/ 02 декабря 2019

Вы можете использовать метод 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 голосов
/ 02 декабря 2019

Я только что нашел through_defaults в документации Django, которая добавлена ​​в .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

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