我想对一种情况进行建模,但我在处理它时遇到了很大的麻烦。域是这样的:有帖子,每个帖子都必须与 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="..."/>
这是正确的方法吗?有效吗?模板可以不知道下面的对象吗?
最佳答案
我觉得你的方法不错。您只需要重写图片和视频模型中的draw_item方法。您的模板将类似于
{% for post in posts %}
{{ post.media_content.draw_item }}
{% endfor %}
通用外键指向哪个模型并不重要,只要它定义了 draw_item
方法即可。
关于python - 在 django 中处理通用关系时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5890559/