2011-09-27 86 views
0

我有一些模型需要與某些圖像有多對多的關係。我不想單獨創建每個關係,而是希望獲得一些可用於我所有模型的通用模型關係。所以我創建圖像和模型的ImageItem(我不知道如果我在正確的軌道上。):Django在仿製模型上的多對多關係

from django.contrib.contenttypes import generic 
from django.contrib.contenttypes.models import ContentType 

class Image(models.Model): 
    title = models.CharField(max_length=100) 
    image = models.ImageField(upload_to='images') 

class ImageItem(models.Model): 
    image = models.ForeignKey(Image) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    object = generic.GenericForeignKey('content_type', 'object_id') 

我想要做的是,每次我創建一個新的形象,我想要選擇要將此圖像分配給的對象。所以,進入管理,我需要有這樣的:

Image: chicago_bulls.jpg 
Selected model: Player 
Selected: 
Michael Jordan 
Scotie Pippen 

Image: kobe_bryant.jpg 
Selected model: Team 
Selected: 
Los Angeles Lakers 
US National Team 

是我的模型設計是否正確?我也想使用ModelMultipleChoiceField,但我無法弄清楚如何做到這一點。

回答

1

看看解釋GenericInlineModelAdmin的文檔。

如果我得到你的權利,示例不正是你想要什麼:

class Image(models.Model): 
    image = models.ImageField(upload_to="images") 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey("content_type", "object_id") 

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

這是從你的設計有一點不同,因爲像場是增加了普通關係到所有類型的其他模型的一部分(內容)對象/模型。

這樣,你可以簡單地通過使用已經提到InlineAdmins管理界面附加圖片:

class ImageInline(generic.GenericTabularInline): 
    model = Image 

class ProductAdmin(admin.ModelAdmin): 
    inlines = [ 
     ImageInline, 
    ] 
+0

嗨阿里。感謝您的答覆。基本上我試圖從圖像管理頁面設置產品圖像。 1)選擇圖像2)選擇團隊或玩家將圖像添加到。對不起,我猜測這有點混亂,有點不符合標準。 – pocoa

+0

那麼Django的管理員中GenericForeignKey的標準渲染有什麼問題?看看這個詳細的解釋:http://blog.yawd.eu/2011/admin-site-widget-generic-relations-django/當然,你可以添加一些JavaScript,使小部件更加可用,但一開始應該給你你想要的。 – arie

+0

感謝您的鏈接。似乎沒有簡單的方法來做到這一點。 – pocoa