我在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很新......我错过了什么?
由于
答案 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
如果您需要在那里进行过滤,也可以在管理网站外使用此类表单。