通过Gallery模型将多个模型链接到图像模型

时间:2014-04-08 22:38:24

标签: django

我正在尝试将多个模型(在此示例中为CoolModel和OtherModel)链接到Gallery Model ...而后者将具有多个Images。所以CoolModel可以有多个图片,而OtherModel可以有多个图片...都存储在同一个(图像)表中。

我认为这是应该如何布局的,但我不清楚我将如何操纵(创建/删除)CoolModel和OtherModel的实例。有人可以提供示例代码来创建CoolModel并为其分配几个图片吗?

class Gallery(models.Model):
# not sure how to link this to Image...or if it even has to be?

class Image(models.Model):
    gallery = models.ForeignKey(Gallery)
    image = models.ImageField(upload_to='media')

class CoolModel(models.Model):
    name = models.CharField(max_length=128)
    images = models.ForeignKey(Gallery)

class OtherModel(models.Model):
    name = models.CharField(max_length=128)
    images = models.ForeignKey(Gallery)

2 个答案:

答案 0 :(得分:0)

在我看来,你需要看看ManyToMany的关系。我的一些图片最终会出现在重复的画廊中。此时,如果您有外键关系,则图像将只能属于一个特定的图库。这可能是您想要的,但图像有时可分为几类。我认为你会想要一个很多人到你的画廊,所以你可以有画廊入口"体育,明星"都可以适用于勒布朗詹姆斯酷图像......

答案 1 :(得分:0)

我并不完全明白你想要实现的目标,但它听起来类似于播放列表,或者像this example from the Django docs一样,通过中间人与ManyToMany关系相似。这是一个基于对你正在寻找什么样的关系的总体黑暗猜测的例子(因为我不知道CoolModel'应该做什么或者为...:

class CoolModel(models.Model):
    name = models.CharField(max_length=128)
    other attributes

class Gallery(models.Model):
    coolmodel = models.ManyToMany(CoolModel, through='Image')

class Image(models.Model):
    image = models.ImageField(upload_to='media')
    gallery = models.ForeignKey(Gallery)
    coolmodel = models.ForeignKey(CoolModel)

中介的关键是利用through参数,文档中有一些关于如何使用这些关系插入对象的好例子(从文档中复制):

>>> ringo = Person.objects.create(name="Ringo Starr")
>>> paul = Person.objects.create(name="Paul McCartney")
>>> beatles = Group.objects.create(name="The Beatles")
>>> m1 = Membership(person=ringo, group=beatles,
...     date_joined=date(1962, 8, 16),
...     invite_reason="Needed a new drummer.")
>>> m1.save()
>>> beatles.members.all()
[<Person: Ringo Starr>]
>>> ringo.group_set.all()
[<Group: The Beatles>]
>>> m2 = Membership.objects.create(person=paul, group=beatles,
...     date_joined=date(1960, 8, 1),
...     invite_reason="Wanted to form a band.")
>>> beatles.members.all()
[<Person: Ringo Starr>, <Person: Paul McCartney>]