Любой способ обновить поле ManyToMany через набор запросов? - PullRequest
1 голос
/ 19 сентября 2019

Предположим, у меня есть объект:

survey = Survey.objects.all().first()

, и я хочу создать связь между ним и группой объектов:

respondents = Respondent.objects.all()

for r in respondents:
    r.eligible_for.add(survey)

, где eligible_for - поле M2Mв модели Respondent.

Есть ли способ сделать это за один проход или мне нужно перебрать набор запросов?

models.py

class Questionnaire(models.Model):
    label = models.CharField(max_length=48)
    organization = models.ForeignKey('Home.Organization', on_delete=models.PROTECT, null=True)

class Respondent(models.Model):
    user = models.OneToOneField('Home.ListenUser', on_delete=models.CASCADE)
    organization = models.ForeignKey('Home.Organization', on_delete=models.PROTECT)
    eligible_for = models.ManyToManyField('Questionnaire', related_name='eligible_users', blank=True)

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

.add(..) может принимать переменное количество элементов и обычно добавляет их массово.

Таким образом, вы можете добавить все r sс:

survey.<b>eligible_users</b>.add(<b>*respondents</b>)

Здесь мы таким образом добавляем respondents к отношению в обратном порядке.Обратите внимание на звездочку (*) перед respondents, которая, таким образом, будет выполнять повторяемую распаковку .

1 голос
/ 19 сентября 2019

https://docs.djangoproject.com/en/2.2/ref/models/relations/

survey.eligible_users.set(respondents) - это еще один способ сделать это, не распаковывая список.

...