Python django中泛型关系的处理问题

Python django中泛型关系的处理问题,python,django,database-design,django-models,relational-database,Python,Django,Database Design,Django Models,Relational Database,我想模拟一种情况,但我真的很难处理它。域是这样的:有帖子,每个帖子都必须与MediaContent一一关联。MediaContent可以是图片或视频(目前可能是音乐)。因此,我得到的是: mediacontents/models.py class MediaContent(models.Model): uploader = models.ForeignKey(User) title = models.CharField(max_length=100) created =

我想模拟一种情况,但我真的很难处理它。域是这样的:有帖子,每个帖子都必须与MediaContent一一关联。MediaContent可以是图片或视频(目前可能是音乐)。因此,我得到的是:

mediacontents/models.py

class MediaContent(models.Model):
    uploader = models.ForeignKey(User)
    title = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now_add=True)

    def draw_item(self):
        pass

    class Meta:
        abstract = True

class Picture(MediaContent):
    picture = models.ImageField(upload_to='pictures')

class Video(MediaContent):
    identifier = models.CharField(max_length=30) #youtube id
class Post(models.Model):
    ...
    # link to MediaContent
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    media_content = generic.GenericForeignKey('content_type', 'object_id')
posts/models.py

class MediaContent(models.Model):
    uploader = models.ForeignKey(User)
    title = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now_add=True)

    def draw_item(self):
        pass

    class Meta:
        abstract = True

class Picture(MediaContent):
    picture = models.ImageField(upload_to='pictures')

class Video(MediaContent):
    identifier = models.CharField(max_length=30) #youtube id
class Post(models.Model):
    ...
    # link to MediaContent
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    media_content = generic.GenericForeignKey('content_type', 'object_id')
我最终想做的是,Being能够调用如下方法:

post1.media_content.draw_item()
>> <iframe src="youtube.com" ...>
post2.media_content.draw_item()
>> <img src="..."/>
post1.media\u content.draw\u item()
>> 
post2.media\u content.draw\u item()
>> 

这是正确的方法吗,有效吗?模板可以不知道下面的对象吗?

我觉得你的方法不错。您只需要覆盖图片和视频模型中的draw_item方法。您的模板将类似于

{% for post in posts %}
  {{ post.media_content.draw_item }}
{% endfor %}

通用外键指向哪个模型并不重要,只要它定义了一个
draw\u item
方法。

我觉得你的方法不错。您只需要覆盖图片和视频模型中的draw_item方法。您的模板将类似于

{% for post in posts %}
  {{ post.media_content.draw_item }}
{% endfor %}

通用外键指向哪个模型并不重要,只要它定义了
draw\u item
方法。

我看不出有什么问题。只要定义你的方法来解释媒体内容类型(图片或视频)的差异,你就可以了;看起来一点也不难。我看这没什么问题。只要定义你的方法来解释媒体内容类型(图片或视频)的差异,你就可以了;看起来一点也不难。