2010-03-12 55 views
2

我試圖創建一個處理以下一個Django模型的首選項目:設置一個多到一個在Django

  • Item可以有幾個Name秒。
  • 其中ItemName是其主要的Name,即Name顯示爲Item

(型號名稱已更改爲保護無辜者。)

models.py我得看起來像:

class Item(models.Model): 
    primaryName = models.OneToOneField("Name", verbose_name="Primary Name", 
     related_name="_unused") 
    def __unicode__(self): 
     return self.primaryName.name 

class Name(models.Model): 
    item = models.ForeignKey(Item) 
    name = models.CharField(max_length=32, unique=True) 
    def __unicode__(self): 
     return self.name 

類元: 訂貨= [ '名']

admin.py的樣子:

class NameInline(admin.TabularInline): 
    model = Name 

class ItemAdmin(admin.ModelAdmin): 
    inlines = [ NameInline ] 

admin.site.register(Item, ItemAdmin) 

它看起來像數據庫架構工作正常,但我有問題的管理員,所以我不知道在這一點上的任何事情。我的主要問題是:

  • 我怎麼到primaryName需要是Name S中的項目之一正在編輯的管理員解釋一下嗎?
  • 有沒有辦法自動設置primaryName到第一個Name發現,如果primaryName沒有設置,因爲我使用內聯管理員名稱?

編輯:蕩,我忘了這仍然是開放的。無論如何,我重新開始重做模型,用Item中的名稱(CharField)替換primaryName,並將Name更名爲Alias。這不能做我想做的事(只搜索一個表的名稱),但我不能讓primaryName工作,如果它沒有null=True,因爲Item在任何Name創建之前得到保存,這意味着任何嘗試自動分配Name會看到一個空的QuerySet並失敗。

我可以看到它的工作的唯一辦法是讓Name的節約常規自動設置本身作爲其母公司的primaryName如果primaryNameNULL,這只是沒有跟我好坐。

回答

1
  • 我怎麼到primaryName需要是該項目的 名稱之一正在編輯的管理員解釋一下嗎?

退房formfield_for_foreignkey()ModelAdmin docs

class ItemAdmin(admin.ModelAdmin): 
    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == "primaryName": 
      # tweak the filter to your liking. 
      kwargs["queryset"] = Name.objects.filter(item=...) 
      return db_field.formfield(**kwargs) 
     return super(ItemAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 
+0

雖然不是一個確切的答案,但這個答案是最接近的,並且在其他地方證明是有用的。 – 2010-04-20 13:09:39

0
  • 有自動設置primaryName到第一名稱發現, 如果沒有設置primaryName的方式,因爲我 使用內聯管理員的名字呢?

你可以在你的模型save方法做到這一點,是這樣的:

class Item(models.Model): 
    ...(snip)... 
    def save(self,force_insert=False,force_update=False): 
     if self.primaryName is None: 
      self.primaryName = self.name_set.all()[0] 
      # will want to handle the case that no names are set, etc 
     super(Item,self).save(force_insert,force_update) 
+0

但不django保存內聯之前的外模型?否則它將沒有Item標識插入Name對象上的外鍵字段。 – 2010-03-12 05:07:04

+0

即使它在外部模型之前保存了內聯,那麼由於「Item」尚未保存,因此還沒有密鑰,因此將內聯「item」設置爲什麼?這只是在現實世界中沒有發生? – 2010-03-12 16:26:40

相關問題