django - 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.id
Guest.meal
更新
感谢@dirkgroten
首先,我将一个 DataField 的命名更改
Guest.meal
为Guest.meals
我的模型。然后我使用
.add
表单中的方法关联两个模型
更新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
解决方案
推荐阅读
- python - 您可以在 Jupyter Notebook 中连续对齐 display() 中的项目吗
- android - Android:MotionLayout 不允许孩子展开并填满屏幕
- javascript - 弹出消息后如何从内容脚本返回消息?
- next.js - vercel / zeit 上的 nextjs 写入磁盘 fs.writeFile
- html - 如何在 bootstrp 中创建在移动视图上不能在 x 轴上滚动但仍可见的表?l
- python-3.x - Python:如何通过比较列表的内容将列表拆分为多个?
- android - 在将数据从一个片段发送到另一个片段时,在同一行中初始化和声明 Bundle
- php - Laravel foreach:未定义的变量
- java - 如何执行jdbc查询?
- angular - Angular 9 createEffect Observable 类型错误