我有一种情况我不知道如何正确建模。我希望班级中的每个孩子都与媒体对象(照片,视频或音乐)相关联。我想知道哪个是这个问题的优先方法。我现在拥有的是:
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,每个表上有一个(图片,视频和音乐(如果域名发生变化,可能会更多)。
答案 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而不是对类的引用的可能性