django中的数据库建模

时间:2011-05-03 01:05:39

标签: python django database-design relational-database

我有一种情况我不知道如何正确建模。我希望班级中的每个孩子都与媒体对象(照片,视频或音乐)相关联。我想知道哪个是这个问题的优先方法。我现在拥有的是:

class Something(models.Model):

    media = models.ForeignKey(Media)


class Media(models.Model):
    title = models.CharField(max_lenght=100)
    def get_tiny_object():
        pass
    def get_big_object():
        pass

class Picture(Media):
    picture = models.ImageField()
    def get_tiny_object():
        return ...
    ...

class Video(Media):
    video = models.CharField(max_length=200) #youtube id
    ...

class Music(Media):
    music = ....

你明白了。 ¿这有用吗?我是否还应该在“Something”上录制什么样的媒体?

修改

拥有Media类背后的想法是,我可以在模板中渲染,而不知道我渲染的是哪种媒体。 get_tiny_object()应该返回,如果是图片:

"<img style="width:60px; height: 50px" ...>"

所以如果我有一个媒体对象的外键让我们说它是id = 4,django是否知道应该从音乐表中获取它,如果我关联的对象是音乐类型?因为我有3个不同的id = 4,每个表上有一个(图片,视频和音乐(如果域名发生变化,可能会更多)。

2 个答案:

答案 0 :(得分:2)

我仍然认为这个问题有点难以理解 - 标题是 Django中的数据库建模毕竟...但是,这是一个完全有效且合理的事情,并且似乎符合你的意图:

建议的方法是multi table inheritance - 示例:

class Media(models.Model):
    pass

class Something(models.Model):
    media = models.ForeignKey(Media)

class Picture(Media):
    foo = models.CharField(max_length=100)

    def get_tiny_object(self):
        return self.foo

class Video(Media):
    bar = models.CharField(max_length=100)

    def get_tiny_object(self):
        return self.bar

picture = Picture.objects.create(foo='some picture')
video = Video.objects.create(bar='some video')
something1 = Something.objects.create(media=picture)
something2 = Something.objects.create(media=video)
print something1.media.get_tiny_object() # this is a picture remember?
print something2.media.get_tiny_object() # and lo, here is a video

答案 1 :(得分:0)

http://docs.djangoproject.com/en/dev/topics/db/models/#one-to-one-relationships

这表示你应该使用OneToOneField将每个图片,视频,音乐与媒体条目相关联,并且它们都直接从models.Model继承。

此外,您需要将Something更改为

class Something(models.Model):

    media = models.ForeignKey("Media")

因为当你定义Something时没有定义Media(如果你把它放在它下面),它就不会起作用,django为你提供了使用classname而不是对类的引用的可能性