Django, отношения "многие ко многим", как вставить значение для всех ключей в таблице?

У меня есть 3 модели Company, Discount и CompanyDiscountRelation, как показано ниже:

class Company(models.Model):
    name = models.CharField(max_length=150)

    def __str__(self):
        return self.name


class Discount(models.Model):
    name = models.CharField(max_length=150)
    discount_value = models.IntegerField()

    def __str__(self):
        return self.name


class DiscountCompanyRelation(models.Model):
    company= models.ForeignKey(Company, on_delete=models.CASCADE)
    discount = models.ForeignKey(Discount, on_delete=models.CASCADE)
    is_active = models.BooleanField(default=True)

Я знаю, как назначить ранее созданную скидку одной компании. Я делаю это с помощью формы DiscountCompanyRelationForm и выбираю компанию из списка формы. Но я хочу назначить скидку всем компаниям одним щелчком мыши. Как это сделать? Я пробовал получить все ID путем: Company.objects.values_list('pk', flat=True) и перебирать их, но я не думаю, что так это должно быть сделано, и у меня есть проблема с сохранением формы: form.save()

Я пытался весь день, но теперь сдался. Извините, если это базовые знания. Я работаю с django несколько дней.

Если я правильно понял вопрос, вы хотите выбрать подмножество компаний в таблице Company и применить определенную скидку.

Первый может быть ModelMultipleChoiceField, второй ModelChoiceField. Поместите их в форму с соответствующими наборами запросов для компаний и скидок, которые можно выбрать, и при проверке формы примените скидку:

discount = form.cleaned_data['discount'] 
companies = form.cleaned_data['companies']
for company in companies:
    relation = DiscountCompanyRelation(
        discount = discount,
        company = company,
        is_active = # whatever you need
    )
    relation.save()

Вам нужно подумать о том, что произойдет, если скидка будет применена к компании, у которой уже есть скидка. Вы поместите код в вышеприведенный цикл для проверки и выполнения соответствующего действия.

Я бы настоятельно рекомендовал указывать related_name на ваших ForeignKey, а не полагаться на то, что Django сгенерирует автоматически, если вы этого не сделаете.

Вы также можете посмотреть на опцию "through" модели ManyToManyField, потому что это другой способ создать ту же структуру БД, но с поддержкой ManyToMany в Django.

Вернуться на верх