2010-11-16 44 views
1
class A(models.Model): 
    foreign = models.ForeignKey(B, unique=True) 

我有上面的代码 - 我如何确保在A的Admin下的下拉菜单中,对于'外部',我只提供了独特的选择?这只是为了防止用户违反唯一性约束并且以管理员错误消息呈现。如何限制Django中的下拉菜单管理

回答

0

请看ModelAdmin.formfield_for_foreignkey()here。缺点是不得不求助于raw SQL

class AModelAdmin(admin.ModelAdmin): 
def formfield_for_foreignkey(self, db_field, request, **kwargs): 
    if db_field.name == "foreign": 
     kwargs["queryset"] = B.objects.raw('SELECT * FROM myapp_a where not exists (select id from myapp_b where b.id=a.foreign_id') 
    return super(AModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

恕我直言“非空非空白独特FKs”看起来像重新考虑你的建模的好机会 - 可能合并两个模型。每当我发现自己在Django中挣扎得太过分时,我就试图做一些天真的事情。

+0

不幸的是,这是行不通的,因为管理模板无法正确显示 - 我得到: “在呈现时捕获AttributeError:'RawQuerySet'对象没有任何属性'all'” – cockadoodledo 2010-11-17 15:14:00

+0

如果您打开http:// code.djangoproject.com/我可以发送一个补丁来向RawQuerySet添加一个dummy all()方法。 – 2010-11-17 22:47:26

+0

您也可以尝试:kwargs [“queryset”]。all = kwargs [“queryset”] .__ iter__ – 2010-11-17 22:53:42