2016-05-18 16 views
2

私は、DeviceModelとDeviceの2つのモデルを持つDjangoデータベースを持っています。たとえば、DeviceModelオブジェクトが「LCDパネル」であり、Deviceオブジェクトが「LCDパネル№547」であるとします。したがって、これら2つのテーブルにはManyToOne関係があります。Djangoの複雑な "limit_choices_to"機能

class DeviceModel(models.Model): 
    name = models.CharField(max_length=255) 

class Device(models.Model): 
    device_model = models.ForeignKey(DeviceModel) 
    serial_number = models.CharField(max_length=255) 

ここで、DeviceModelオブジェクト間にリレーションシップを追加する必要があります。たとえば、 "LCD Panel"は "Tablet"オブジェクトまたは "Monitor"オブジェクトにあります。また、別のオブジェクトは個別オブジェクトである可能性があるため、他のオブジェクトとはリンクしません。

私はManyToMany関係でこれを行うことにしました.JSONなどでシリアライズを使用することに反対しました(btw、どのような状況でより良い方法がありますか?)。

私はデバイスモデル間のすべての関係を満たしており、デバイステーブルに機能関係を追加する必要があることを知っています。

そのために、「self」を指す「master_dev」外部キーフィールドを追加しました。それは私が必要とするように正確に動作しますが、私はdjangoの管理パネルで出力を制限したいです。 device_linksで接続されているデバイスのみが表示されます。現在のコード:だから

class DeviceModel(models.Model): 
    name = models.CharField(max_length=255) 
    device_links = models.ManyToManyField('self') 

class Device(models.Model): 
    device_model = models.ForeignKey(DeviceModel) 
    serial_number = models.CharField(max_length=255) 
    master_dev = models.ForeignKey('self', blank=True, null=True) 

、どのように私は、管理パネルでmaster_devフィールドの出力を制限することができますか? forms.pyで

答えて

0

「limit_choices_to」についての私の質問には直接答えはありませんがこの関数は、私は、所望の出力実現ソリューション投稿:フォームを使用していない理由を私はフォームを必要としない

from django import forms 
from django.contrib import admin 
from .models import DeviceModel, Device 

class DeviceForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(DeviceForm, self).__init__(*args, **kwargs) 
     try: 
      linked_device_models = self.instance.device_model.device_links.all() 
      linked_devices = Device.objects.filter(device_model__in=linked_device_models) 

      required_ids = set(linked_devices.values_list("id", flat=True)) 

      self.fields['master_dev'].queryset = Device.objects.filter(id__in=required_ids).order_by("device_model__name", "serial_number")   
     except: 
      # can't restrict masters output if we don't know device yet 
      # admin should edit master_dev field only after creation 

      self.fields['master_dev'].queryset = Device.objects.none() 


    class Meta: 
     model = Device 
     fields = ["device_model", "serial_number", "master_dev"] 


class DeviceAdmin(admin.ModelAdmin): 
    form = DeviceForm 

    list_display = ('id', 'device_model', 'serial_number') 
    list_display_links = ('id', 'device_model') 
    search_fields = ('device_model__name', 'serial_number') 
    list_per_page = 50 
    list_filter = ('device_model',) 
1

...そこ機能「limit_choices_to」ですが、私はそれを動作させることはできません。

def master_dev_chioses(): 
    chioses = DeviceModel.objects.filter(do your connection filter here - so not all Devicemodels comes to choicefield) 


class DeviceForm(forms.ModelForm): 
    class Meta: 
     model = Device 

    def __init__(self, *args, **kwargs): 
     super(Device, self).__init__(*args, **kwargs) 

     self.fields['master_dev'].choices = master_dev_chioses() 
+0

を、私は、私はuが:)を行うと信じてDjangoの管理パネル – kostr22

+0

で出力を制限する必要がありますか? –

+0

私のプロジェクトでは、このフォームなどを使用しますが、私のDjanjo管理パネルも明確で簡単に編集できます。 – kostr22