2011-09-27 67 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