如何在重写的save()方法内从ManyToManyField写入和检索数据?

时间:2019-12-30 16:38:59

标签: django django-models django-forms

我需要通过模板中的Model形式将任何数据写入ManyToManyField,但是在使用这种多对多关系之前,我收到类似“ ...需要字段“ id”的值的错误。 ”。它显示了当我尝试在覆盖的save()方法中使用self.service(“ service”是我的ManyToManyField)时。我知道ManyToManyField不是基本字段,它返回类似于queryset的内容,但是我如何在save()方法中操作数据,因为“ self.service”不起作用。

# models.py
class Appointments(models.Model):
    name = models.CharField(max_length=200, db_index=True, verbose_name='Имя, фамилия')
    tel = models.CharField(max_length=200, db_index=True, verbose_name='Номер телефона')
    e_mail = models.CharField(max_length=200, blank=True, db_index=True, verbose_name='E-mail')
    car = models.ForeignKey('Cars', null=True, on_delete=models.PROTECT, verbose_name='Тип автомобиля')
    num_car = models.CharField(max_length=200, null=True, db_index=True, verbose_name='Гос.номер автомобиля')
    **service = models.ManyToManyField(Services, verbose_name='Тип услуги')**
    date_created = models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Дата публикации заявки')
    date_service = models.DateField(db_index=True, verbose_name='Дата')
    time_service = models.TimeField(db_index=True, help_text="Введите время в таком формате: 15:00", verbose_name='Время')
    price = models.CharField(max_length=50, db_index=True, null=True, verbose_name='Цена')

    def save(self, *args, **kwargs):
        for i in Services_prices.objects.all():
            ccar = i.car
            sservice = i.service
               for d in self.service:
                    if self.car == ccar and d == sservice:
                        self.price = i.price
                        break
                    elif ccar == None and d == sservice:
                        self.price = i.price
                        break
        super().save(*args, **kwargs)



# forms.py
class AppointmentForm(forms.ModelForm):
    service = forms.ModelMultipleChoiceField(queryset=Services.objects.all(), required=False, widget=forms.CheckboxSelectMultiple())
    class Meta:
        model = Appointments
        fields = ('name', 'tel', 'e_mail', 'car', 'num_car', 'service', 'date_service', 'time_service')

1 个答案:

答案 0 :(得分:0)

为了在两个对象之间具有多对多关系,您需要两个对象的主键。在调用super的保存之前,您的模型还没有主键。

在您覆盖的保存方法中,首先调用super(例如, func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return myDic.count } ),然后处理您的事情,然后再次保存。