Django:来自不同模型的模型实例的有序列表?

sga*_*a62 4 python sorting django django-models django-queryset

用户可以将三种不同类型的内容上载到我们的网站上:图像,视频,音频。以下是每种类型的模型:

class ImageItem(models.Model):
    user = models.ForeignKey(User)
    upload_date = models.DateTimeField(auto_now_add=True)
    image = models.ImageField(upload_to=img_get_file_path)
    title = models.CharFiled(max_length=1000,
                             blank=True)

class VideoItem(models.Model):
    user = models.ForeignKey(User)
    upload_date = models.DateTimeField(auto_now_add=True)
    video = models.FileField(upload_to=vid_get_file_path)
    title = models.CharFiled(max_length=1000,
                             blank=True)

class AudioItem(models.Model):
    user = models.ForeignKey(User)
    upload_date = models.DateTimeField(auto_now_add=True)
    audio = models.FileField(upload_to=aud_get_file_path)
    title = models.CharFiled(max_length=1000,
                             blank=True)
Run Code Online (Sandbox Code Playgroud)

我有一个名为的页面library.html,该页面按从最新上传到最早的上传的顺序呈现用户已上传的所有项目(它显示每个实例的titleupload_date,并在左侧放一个小图标,表示它是哪种项目)。

假设它需要三个单独的查询,如何合并三个查询集?如何确定最近上传的文件的顺序?

acj*_*jay 5

或者,您可以使用多表继承并将通用属性分解为超类模型。然后,您只需order_by在超类模型上上传日期。第三方应用程序django-model-utils提供了一个称为继承管理器的自定义管理器,该管理器可让您自动向下转换到查询中的子类模型。

from model_utils.managers import InheritanceManager

class MediaItem(models.Model):
    objects = InheritanceManager()

    user = models.ForeignKey(User)
    upload_date = models.DateTimeField(auto_now_add=True)
    title = models.CharFiled(max_length=1000,
                             blank=True)

class ImageItem(MediaItem):
    image = models.ImageField(upload_to=img_get_file_path)

class VideoItem(MediaItem):
    video = models.FileField(upload_to=vid_get_file_path)

class AudioItem(MediaItem):
    audio = models.FileField(upload_to=aud_get_file_path)
Run Code Online (Sandbox Code Playgroud)

然后,您的查询就是:

MediaItem.objects.all().order_by('upload_date').select_subclasses()
Run Code Online (Sandbox Code Playgroud)

这样,您只需一个查询(3个联接)即可获得所需的内容。另外,您的数据可以更好地规范化,并且支持各种更复杂的查询以及分页非常简单。

即使您不这样做,我仍然会使用抽象基类继承来概念上规范化您的数据模型,即使您没有获得数据库端和ORM的好处。