Django 通用模型上的多对多关系

0 投票
1 回答
692 浏览
提问于 2025-04-17 03:10

我有一些模型需要和很多图片建立多对多的关系。为了避免每次都单独创建每个关系,我想设计一些通用的模型关系,这样我就可以在所有模型中使用它们。所以我创建了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 个回答

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,
    ]

撰写回答