Django limit_choices_to处于循环关系

时间:2009-11-05 12:21:36

标签: django django-models django-admin

我在Django模型中实现了一个循环的OneToMany关系,并尝试在同一个类中使用limit_choices_to选项。

我可以在没有任何错误或警告的情况下同步syncdb但是没有遵守限制。 使用shell我能够保存并在管理员处收到错误消息:

  

“不允许加入字段'类型'。   您是否拼错'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选项的基本思想是保证任何类型“p”不能是任何其他AdministrativeArea的父类,并且父类不能与当前AdministrativeArea类型的类型相同。

我对Django很新......我错过了什么?

由于

1 个答案:

答案 0 :(得分:0)

您可以创建一个模型表单,在使用现有模型实例时动态调整特定字段的查询集。

### 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

如果您需要在那里进行过滤,也可以在管理网站外使用此类表单。