我想对情况建模,但在处理该问题时确实遇到了麻烦。域是这样的:有帖子,并且每个帖子都必须与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


posts / models.py

class Post(models.Model):
    ...
    # link to MediaContent
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    media_content = generic.GenericForeignKey('content_type', 'object_id')


我最终想要做的是,能够调用类似的方法:

post1.media_content.draw_item()
>> <iframe src="youtube.com" ...>
post2.media_content.draw_item()
>> <img src="..."/>


这是正确的方法吗?模板可以与下面的对象无关吗?

最佳答案

您的方法对我来说看起来不错。您只需要在Picture和Video模型中覆盖draw_item方法即可。您的模板看起来像

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


只要定义了draw_item方法,通用外键指向哪个模型都没有关系。

09-12 21:41