2010-11-16 42 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