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
中为驱动程序选择驱动程序类
时,我可以从所有驱动程序类
中进行选择。我不确定我的模型中是否有可以更改的内容以实现我想要的,或者我是否只需要更改驱动程序sModelAdmin
类以仅显示正确的事件。正确的步骤是什么?您应该指定一个自定义的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将其连接起来更有意义。