首页 > 解决方案 > Django:如何在表单中的多对多关系中保存 ID?

问题描述

我正在测试嵌套不同的模型以及如何通过 django 中的表单填充它们。

(使用 Django 2.2 和 PostgreSQL)

这些是我的模型...

模型.py

class Guest(models.Model):
    name = models.CharField(max_length=40)
    meal = models.ManyToManyField('Meal')

    def __str__(self):
        return self.name

class Meal(models.Model):
    dish = models.ForeignKey('Dish', null=True, blank=False, on_delete=models.SET_NULL)
    table = models.PositiveIntegerField(null=False, blank=False)

    def __str__(self):
        return "Dish:" "{}" "/ Table:" "{}".format(self.dish, self.table)


class Dish(models.Model):
    name = models.CharField(max_length=40)

    def __str__(self):
        return self.name

视图.py

class GuestCreateView(CreateView):
    model = Guest
    template_name ="testa/create_guest.html"
    form_class = GuestForm
    success_url = reverse_lazy('testa:testa_home')

    def form_valid(self, form):
        return super().form_valid(form)

表格.py

class GuestForm(forms.ModelForm):

    dish = forms.ModelChoiceField(queryset=None)

    # --- Input for meal.table
    table_input = forms.IntegerField(widget=forms.NumberInput)

    class Meta:
        model = Guest
        fields = [ 
            'name',
            'dish',
            'table_input'
            ]


     # --- Dish names from dish.model
    def __init__(self, *args, **kwargs):
        super(GuestForm, self).__init__(*args, **kwargs)
        self.fields['dish'].queryset = Dish.objects.all()


    def save(self):
        # --- save first Meal.model
        data = self.cleaned_data
        mealData = Meal(table=data['table_input'], dish=data['dish'])
        mealData.save()

        # --- take the meal.pk for guest.meal_id
        meal_id = mealData.id

        # --- save Guest.model
        guestData = Guest(name=data['name'], meal_id=data['meal_id'])
        guestData.save()

问题

Dish.model是菜肴列表(比萨饼、热狗、蛋糕...)

Meal.model保存相关菜肴并添加表号

Guest.model与菜肴和桌号相关,还添加了客人姓名。我仅出于培训目的使用多对多关系。

我有模板,我可以在其中输入每个值。如果我输入所有值,它会将菜肴和餐桌编号保存在我的数据库中,但不会保存客人姓名和 ManyToMany 关系。顶部出现一条错误消息,并与KeyError 'meal_id'我的 forms.py 中的 a 相关(行后:# --- save Guest.model)。

所以问题是我首先需要保存Meal.model。所以我可以将主键Meal.model放入联接表或数据字段Guest.meal中。问题是我真的不明白这是如何工作的。所以我采用Guest.meal了外键数据字段的方法并添加了_id。但Guest.meal与连接表有关,Django Doc (Database Representatio) 指出了这一点。

所以我的问题是:我怎样才能在Guest.model和之间建立联系Meal.model?我还想在多对多关系中我需要在 DataField 中同时保存Guest.id+ ?Meal.idGuest.meal

更新

感谢@dirkgroten

更新forms.py

class GuestForm(forms.ModelForm):

    dish = forms.ModelChoiceField(queryset=None)

    # --- Input for meal.table
    table_input = forms.IntegerField(widget=forms.NumberInput)

    class Meta:
        model = Guest
        fields = [ 
            'name',
            'dish',
            'table_input'
            ]


     # --- Dish names from dish.model
    def __init__(self, *args, **kwargs):
        super(GuestForm, self).__init__(*args, **kwargs)
        self.fields['dish'].queryset = Dish.objects.all()


    def save(self):
        # --- save the new Meal.object
        data = self.cleaned_data
        mealData = Meal(table=data['table_input'], dish=data['dish'])
        mealData.save()

        # --- save the new Guest.object 
        guestData = Guest(name=data['name'])
        guestData.save()

        # --- add a m2m relation between Guest.object and Meal.object
        guestData.meals.add(mealData)
        guestData.save()

        return guestData

标签: djangodjango-modelsdjango-formsdjango-views

解决方案


推荐阅读