2011-12-17 9 views
1

我有以下問題 - 我想在django中創建多對一的映射來表示對象和塊之間的基本關係類似的對象:如何創建與Django的多對一的關係,並在管理界面中顯示它

class Website(models.Model): 
    name = models.CharField(max_length = 100) 

class WebsiteIp(models.Model): 
    website = models.ForeignKey(Website, primary_key = True) 
    ip = models.CharField(max_length = 40, primary_key = True) 
    introduction_date = models.DateField() 

這應該都在網站(父對象)編輯頁面上呈現。雖然這聽起來像微不足道的問題,我真的不能找到什麼有用的東西在這個

回答

2

添加related_name參數您ForeignKey的上WebsiteIP像這樣:

class Website(models.Model): 
    name = models.CharField(max_length = 100) 

class WebsiteIp(models.Model): 
    website = models.ForeignKey(Website, primary_key = True, related_name="IPs") 
    ip = models.CharField(max_length = 40) 
    introduction_date = models.DateField() 

然後,你可以參考IP地址爲多對一從網站一對一映射如下:

website = Website.objects.filter(name="blah") 
if website.count(): 
    IPs = website[0].IPs 

當然未經考驗,但這應該讓你在正確的方向。另外,請查閱:https://docs.djangoproject.com/en/dev/topics/db/models/#many-to-one-relationships

在你admin.py,您可能有這樣的事情:

class WebsiteAdmin(admin.ModelAdmin): 
    list_display = ('name',) 
    search_fields = ['name'] 
    ordering = ('name',) 

更新以下內容:

class WebsiteIpInline(admin.TabularInline): 
    model = WebsiteIp 
    extra = 1 

class WebsiteAdmin(admin.ModelAdmin): 
    list_display = ('name',) 
    search_fields = ['name'] 
    inlines = (WebsiteIpInline,) 
    ordering = ('name',) 

應該顯示你想要的!

+0

我知道related_name會在外鍵目標對象上創建該名稱的成員,但我不明白我如何使用它來獲得在django admin的網站編輯頁面上添加/刪除/修改IP的能力? – 2011-12-17 18:56:52

+0

添加到我的答案。 – mkoistinen 2011-12-17 19:06:39

+0

它確實顯示了一個網站的位置,如果我輸入了一些東西然後我可以編輯它,但是我不能添加多個ips(我認爲extra = 1應該意思是「總是爲一個額外的對象創建表單」)? – 2011-12-17 20:24:31

0

解決此問題的方法是修改依賴關係的主鍵設置(但只適用於這種情況 - 當存在可能對整個表唯一的一個鍵(本例中爲ip)時)。

class WebsiteIp(models.Model): 
    website = models.ForeignKey(Website) 
    ip = models.CharField(max_length = 40, primary_key = True) 
    introduction_date = models.DateField() 

之後(也只有在此之後),mkoistinen提出的解決方案的一部分將以預期的方式工作。一般問題是,Django檢查通過檢查主鍵列的唯一性(以一種錯誤的方式)來創建新對象的能力,所以我想通過重寫一些模型也可以解決這個問題。模型方法,但我不對django內部知識足夠了解,能夠指出什麼方法。

相關問題