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