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)

イベントには、選択するDriverClassための一定量の esがあるはずです。Driver現在の問題は、 aが aと anにDriverしか接続されていないため、 でドライバーにa を選択するときに、すべてのes から選択できることです。目的を達成するためにモデルを変更できるものがあるかどうか、または正しいイベントのみを表示するためにsクラスを変更するだけでよいかどうかはわかりません。正しい手順は何ですか?DriverClassEventDriverClassdjango adminDriverClassDriverModelAdmin

4

2 に答える 2

4

ModelFormdriverclass フィールドのクエリセットを変更するカスタムを指定し、それを次のように追加する必要があります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

注意点の 1 つは、 を変更しても、フォームを送信するまでEventのオプションDriverClassが更新されないことです。フォームは ValidationError をスローし、返されるフォームには正しい選択肢があります。この動作を変更するには、Ajax リクエストと Javascript による動的更新が必要になります。

于 2013-07-26T13:23:58.240 に答える
0

ゲームブレイニアックは正しいです。これは、ドライバーにイベント プロパティを持つことを主張する場合、次のようにモデル化できます。

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 に答える