Django模型关系

Django模型关系,django,django-models,django-admin,Django,Django Models,Django Admin,我有模型 class Event(models.Model): name = models.CharField(max_length = 50) class DriverClass(models.Model): name = models.CharField(max_length = 20) event = models.ForeignKey(Event) class Driver(models.Model): name = models.CharField(

我有模型

class Event(models.Model):
    name = models.CharField(max_length = 50)

class DriverClass(models.Model):
    name = models.CharField(max_length = 20)
    event = models.ForeignKey(Event)

class Driver(models.Model):
    name = models.CharField(max_length = 50)
    event = models.ForeignKey(Event)
    driverclass = models.ForeignKey(DriverClass)

一个事件应该有一定数量的
DriverClass
es供
驱动程序
选择。现在的问题是
驱动程序
仅连接到
驱动程序类
事件
,因此当我在
django admin
中为驱动程序选择
驱动程序类
时,我可以从所有
驱动程序类
中进行选择。我不确定我的模型中是否有可以更改的内容以实现我想要的,或者我是否只需要更改
驱动程序
s
ModelAdmin
类以仅显示正确的事件。正确的步骤是什么?

您应该指定一个自定义的
ModelForm
,用于更改driverclass字段的查询集,并将其添加到您的
ModelAdmin

class DriverForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(DriverForm, self).__init__(*args, **kwargs)
        if self.instance.event: 
            # this form has an event specified in either instance, initial or data
            self.fields['driverclass'].queryset = DriverClass.objects.filter(event=self.instance.event)

class DriverAdmin(admin.ModelAdmin):
    form = DriverForm
一个警告是,当您更改
事件
时,
驱动器类
的选项在您提交表单之前不会更新。表单将抛出ValidationError,返回的表单将具有正确的选择。改变这种行为需要Ajax请求和通过Javascript进行动态更新

是对的。如果您坚持在驱动程序上具有事件属性,则可以将其建模为:

class Event(models.Model):
    name = models.CharField(max_length = 50)

class DriverClass(models.Model):
    name = models.CharField(max_length = 20)
    event = models.ForeignKey(Event)

class Driver(models.Model):
    name = models.CharField(max_length = 50)
    driverclass = models.ForeignKey(DriverClass)

    @property
    def event(self):
        return self.driverclass.event

只要读一读,就会发现你想要的方式实际上是“奇怪的方式”。以您希望的方式,引用完整性得不到保证。

DriverClass
中选择
DriverClass
的过滤标准是什么?驱动程序与一个事件关联,然后事件的DriverClass进行了评估。我相信您的模型构造不正确。这样看,您有一个
事件
,一个事件可以有许多
驱动器类
。好的因此,一个
DriverClass
已经与一个事件关联,因此与某个
DriverClass
关联的
驱动程序已经连接到一个事件,不是吗?我还是得不到你想要的。你是对的,我的模型可能构造得不好。我可以松开Driver->Event链接,但在我看来,这是一种非常奇怪的方式。我只是想知道在django中将多个模型绑定在一起的做法是什么。我可以这么说,这是常规做法吗?@Martol1ni我想是的,对于这种动态的、每实例的更改,重写表单的
\uuuu init\uuuu
方法是常规做法,我认为这正是字段的
queryset
属性的作用。@Martol1ni如果您对这个答案感到满意,请接受它并关闭这个问题好吗?当您更改DriverClass实例的事件时,驱动程序会发生什么情况?如果驱动程序的
事件
发生变化,是否应将驱动程序的
driverclass
设置为适合其
事件
的值,或者是否应删除没有合法driverclass、事件组合的驱动程序@这是一个很好的问题。我想我对这件事想得还不够透彻。我想得越多,我就应该换成@Chris Wesseling的答案。通过driverclass将其连接起来更有意义。