4

我有模型

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)

一个事件应该有一定数量的DriverClassesDriver可供选择。现在的问题是 aDriver只连接到 aDriverClass和 an Event,所以当我DriverClass为 中的驱动程序选择 a 时django admin,我可以从所有DriverClasses 中选择。我不确定是否可以在模型中更改某些内容以完成我想要的,或者我是否只需要更改DriversModelAdmin类以便仅显示正确的事件。正确的程序是什么?

4

2 回答 2

4

您应该指定一个自定义ModelForm来更改驱动程序类字段的查询集并将其添加到您的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

需要注意的是,当您更改 时,您Event的选项在DriverClass您提交表单之前不会更新。表单将抛出 ValidationError,并且返回的表单将具有正确的选择。更改此行为将需要 Ajax 请求和通过 Javascript 进行动态更新。

于 2013-07-26T13:23:58.240 回答
0

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

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

只需阅读Django: ForeignKey limit_choices_to to equal current object's client,看看你想要的方式实际上是“奇怪的方式”。以您希望的方式无法保证参照完整性。

于 2013-08-01T16:53:15.650 回答