我正在使用Django 1.11和mysql作为Web数据库。我有汽车广告贴表。此表有许多列,如标题,价格,发布广告的时间等,有许多列的汽车功能,如类型,条件,汽缸,燃料。他们的每一列都有很多选择。例如,对于状态,有(优秀,非常好,好,差)的选择。用于燃气,柴油。对于气缸选择是3,4,5,6,8,12。等等。我有两个选项来实现它。
1-第一个选项是让汽车表包含没有标题等选项的列。然后将此表连接到其他表(类型,型号,燃料,气缸等表)。然后将每个表以多对一的关系连接到主车厢表 2-第二个选项是让Django模型中的元组有这些选择并在主表中创建字段而不是使每个列单独表,然后通过外键连接它们。
我的问题是,从以下方面来看哪个选项更有效:
1-性能和速度
2-轻松制作表单,并编写并保存到数据库,数据来自表单。
答案 0 :(得分:0)
1-第一个选项是让汽车表包含没有标题等选项的列。然后将此表连接到其他表(类型,型号,燃料,气缸等表)。然后将每个表以多对一的关系连接到主汽车表。
我假设你希望你的模型是这样的:
class CarCondition(models.Model):
condition_id = .. # the primary key, preferably an AutoField
condition_name = models.CharField(unique=True)
然后你会像这样填充CarCondition:
condition_id | condition_name
1 | 'Excellent'
2 | 'Very good'
等。然后在Car:
class Car(models.Model):
title = models.CharField()
...
condition = models.ForeignKey('CarCondition', on_delete=...)
...
ModelForm:
class CarAdForm(forms.ModelForm):
class Meta:
model = Car
就是这样,因为Django将所有外键都转换为ModelChoiceFields。
您可以像这样保存数据:
CarAdForm(req.POST).save()
在你看来。
2-第二个选项是让Django模型中的元组具有这些选项,并在主表中创建字段,而不是使每个列单独表,然后通过外键连接它们。
由于像car_condition这样的列将有一个选择元组,并且将是一个CharField,你将不得不改变一些关于ModelForm的东西,以便它可以呈现为一个选择小部件。请参考示例this answer。您可能需要或不需要CarAdForm(req.POST).save()
以上,具体取决于您对ModelForm的更改。
通过第一种方法创建和保存表单似乎更容易。但是,在我看来,ForeignKey更多的是关于引用完整性,而你只是试图将用户输入限制为几个选择,这最好由选择元组完成。