4

LineType、Service、DomainName、Recordの3つのモデルがあり、それらの間にはm2mまたは外部キーの関係があります。コードは次のとおりです。

class LineType(models.Model):
    linename = models.CharField(max_length=30,primary_key=True)

    def __unicode__(self):
        return self.linename

class Service(models.Model):
    servicename = models.CharField(max_length=30,primary_key=True)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    line = models.ManyToManyField(LineType)

    def __unicode__(self):
        return self.servicename

class DomainName(models.Model):
    domainname = models.CharField(max_length=30,primary_key=True)
    user = models.ForeignKey(SiteProfile)
    service = models.ForeignKey(Service)

    def __str__(self):
        return self.domainname

class Record(models.Model):
    TYPE_CHOICES = (
                ('A','A'),
                ('CNAME','CNAME'),
                ('MX','MX'),
               )
    domainname = models.ForeignKey(DomainName)   

    def get_line(self):
        domain = DomainName.objects.get(pk=self.domainname_id)
        service = Service.objects.get(pk=domain.service_id)
        lines = service.line.all()
        choices = []
        for x in lines:
           choices.append((x.linename,x.linename))
        return choices

    host = models.CharField(max_length=30)
    type = models.CharField(max_length=5,choices=TYPE_CHOICES,default='A')
    line = models.ForeignKey(LineType)
    destaddress = models.CharField(max_length=30)

モデルを紹介します。各ドメイン名は、他のドメイン名が持つことができるサービスを1つだけ持つことができます。各DomainNameには複数のレコードがあります。サービスは、レコードに適用できるLineTypesを定義します。

私はDjangoadminを使用してこれらのモデルを管理していますが、Recordでの「行」の選択はすべてLineTypeオブジェクトです。したがって、問題は、親(DomainName)の「サービス」に従ってRecordのLineTypeをフィルタリングする方法です。

4

1 に答える 1

1

正確な要件と Django のバージョンによって異なります。答えはlimit_choices_to、外部キーの属性を設定するか、ModelAdmin フォームをカスタマイズするかのいずれかです。

使用するlimit_choices_to

行の選択肢を一致するものに限定するだけですlinename == 'foo'

class Record(models.Model):
    # ...
    line = models.ForeignKey(LineType, limit_choices_to={'linename': 'foo'}))

カスタムの使用form

フォームをインスタンス化するときにインスタンスが存在する場合、そのドメインのサービスの行をクエリセットの選択肢として選択できます

class RecordAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(RecordAdminForm, self).__init__(*args, **kwargs)

        # access object through self.instance...
        if self.instance:
            valid_lines = self.instance.domainname.service.line.objects.all()
            self.fields['line'].queryset = valid_lines

class RecordAdmin(admin.ModelAdmin):
    form = RecordAdminForm
    # ...

参照 SO の質問:

于 2016-01-12T15:06:40.087 に答える