在Django中建立具有外键和一对一关系的模型?

时间:2014-03-26 19:29:49

标签: python django django-orm django-models

我正在尝试为我的项目制作models

1)这包括model CarInfo,其中包含有关汽车的详细信息,例如年份,品牌和型号。

class CarInfo(models.Model):
    year = models.IntegerField(blank=True, null=True)
    make=models.OneToOneField('Manufacturer')

2)对于汽车制造,我正在考虑以下模型;

class Manufacturer(models.Model):
    CARMAKER_CHOICES=(('Toyota','TOYOTA'),
                    ('ford','FORD'),
                    ('mazda','MAZDA'), ('Honda','HONDA'), )
    carmaker=models.CharField(max_length=20,choices=CARMAKER_CHOICES)

3)对于汽车模型,我想制作以下模型,但我不知道如何实现它。

class CarModel(models.Model):
    maker=models.ForeignKey(Manufacturer)
    # if the manufacturerer is Toyota, the different models are
    MODEL_CHOICES=(('Prius','PRIUS'),
                    ('Camry','CAMRY'),
                    ('Rav4','RAV4'),)
    carmodel=models.CharField(max_length=20,choices=MODEL_CHOICES)

正如您所看到的,CarModel取决于制造商,因此汽车型号选择将完全不同。在这种情况下我应该如何建立模型,或者我对更好的替代模型持开放态度。

1 个答案:

答案 0 :(得分:0)

单独的Django不能有条件地显示/使用基于另一个的选择。可能最简单的方法是在页面上使用Javascript / jQuery来显示基于先前选择的选项。

或者,你也可以看看使用Django的form wizard在多个阶段显示表单。

无论哪种方式,都必须在表单/模板级别完成,而不是在模型本身。

更新

无法动态根据当前模型中的其他字段填充字段/属性。此外,与其制造商相对应的汽车模型必须存储在某处。目前在MODEL_CHOICES中,但正如您所解释的那样,您希望根据制造商填充这些内容,以及继续更新元组可能会变得很麻烦,因此最好放在数据库中。

因此,如果我们稍微更改了CarModelCarInfo模型,

class CarModel(models.Model):
    carmaker = models.ForeignKey(Manufacturer)
    carmodel = models.CharField(max_length=20)

class CarInfo(models.Model):
    year = models.IntegerField(blank=True, null=True)
    make = models.OneToOneField('Manufacturer')
    model = models.CharField(max_length=20)

它可以为我们提供这样的信息:

+-----+------------+------------+
| id  |  carmaker  |  carmodel  |
+-----+------------+------------+
|  1  |   Toyota   |   Prius    |
|  2  |   Toyota   |   Camry    |
...

然后,如果我们需要通过CarInfo过滤/限制模型给他们的制造商,比如在表单中,可以通过简单的查询来完成:

class CarInfoForm(forms.ModelForm):
    class Meta:
        model = CarInfo

    def __init__(self, *args, **kwargs):
        super(CarInfoForm, self).__init__(*args, **kwargs)
        self.fields['model'] = forms.ModelChoiceField(queryset=CarModel.objects.filter(carmodel=self.instance.carmodel))

同样,通过模板/浏览器中的Javascript或jQuery,这将更加简单。如果您不反对使用第三方库,可以在模型周围添加一些功能作为选择字段:dj-choicesdjango-smart-selectthis django片段是我发现的一些。