Django在泛型模型上有很多关系

时间:2011-09-27 06:54:38

标签: python django django-admin

我有一些模型需要与一些图像有很多关系。我不想单独创建每个关系,而是希望有一些通用的模型关系,我可以用于所有模型。所以我创建了Image和ImageItem模型(我不确定我是否在正确的轨道上......):

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 个答案:

答案 0 :(得分: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,
    ]