2009-11-05 2 views
0

Я применил круговое отношение OneToMany к модели Django и попытался использовать параметр limit_choices_to в этом же классе.Django limit_choices_to при круговой связи

Я могу синхронизировать без каких-либо ошибок или предупреждений, но предел не соблюдается. Использование оболочки Я в состоянии сохранить и в админ я получаю сообщение об ошибке: «Регистрация на поле„типа“не допускается Вы орфографическую ошибку„NEQ“для типа поиска ?»

class AdministrativeArea(models.Model): 
    type = models.CharField(max_length=1, choices=choices.ADMIN_AREA_TYPES) 
    name = models.CharField(max_length=60, unique=True) 

    parent = models.ForeignKey('AdministrativeArea', 
           null=True, 
           blank=True, 
           limit_choices_to = Q(type__neq='p') & Q(type__neq=type) 
    ) 

Основная идея варианта limit_choices_to является гарантировать, что любой тип «р» не может быть родителем OFR любой другой AdministrativeArea И родитель не может быть того же типа, что и текущий тип AdministrativeArea.

Я довольно новичок в Django ... что мне не хватает?

Благодаря

ответ

0

Вы можете создать типовую форму, которая регулирует QuerySet конкретного поля динамически при работе с существующим экземпляром модели.

### in my_app/models.py ### 

class AdministrativeArea(models.Model): 
    type = models.CharField(max_length=1, choices=choices.ADMIN_AREA_TYPES) 
    name = models.CharField(max_length=60, unique=True) 

    parent = models.ForeignKey('AdministrativeArea', 
          null=True, 
          blank=True, 
          limit_choices_to = Q(type__neq='p') 
) 


### in my_app/admin.py ### 

from django.contrib import admin 
import django.forms as forms 
from my_app.models import AdministrativeArea 

class class AdministrativeAreaAdminForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
    super(AdministrativeAreaAdminForm, self).__init__(*args, **kwargs) 
    instance = kwargs.get('instance', None) 
    if instance is not None: 
     parentField = self.fields['parent'] 
     parentField.queryset = parentField.queryset.filter(type__neq=instance.type) 

    class Meta: 
    model = AdministrativeArea 


class AdministrativeAreaAdmin(admin.ModelAdmin): 
    form = AdministrativeAreaAdminForm 

Такую форму можно использовать и вне административного сайта, если вам нужна фильтрация.

Смежные вопросы