【问题标题】:building models with foreignkey and OnetoOne relationship in Django?在 Django 中使用外键和 OnetoOne 关系构建模型?
【发布时间】:2014-03-26 19:29:49
【问题描述】:

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

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

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 取决于制造商,因此车型选择将完全不同。在这种情况下我应该如何构建模型,或者我愿意接受更好的替代模型。

【问题讨论】:

    标签: python django django-orm django-models


    【解决方案1】:

    单独的 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 sn-p 是我发现的一些。

    【讨论】:

    • 我现在不关心形式,我有兴趣建立一个清晰的模型和建立它们的关系。
    • 对我来说,使用选择意味着您正在考虑表单,因为 选择 是由用户做出的。尽管如此,这必须在表单/模板中完成,而不是模型。我会用一个例子来更新我的答案。
    • 我正在寻找一种最佳方式,它可能与我使用选择的方式完全不同(这可能是完全错误的)。请随意提出您认为效果更好的模型。
    猜你喜欢
    • 2018-08-11
    • 2013-05-27
    • 2018-01-10
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2020-04-20
    • 2011-01-16
    • 1970-01-01
    相关资源
    最近更新 更多