Django .objects,获取来自不同模型的合并查询集

时间:2020-02-28 16:23:51

标签: python django django-models django-queryset django-filters

我有一个抽象的基础模型(“ Base”),从中继承了两个模型:“电影”和“卡通”。我向用户显示电影和卡通片的列表(在itertools.chain的帮助下)。然后,我想让用户有机会删除这些项目中的任何一个,而无需事先知道它是电影还是卡通。我正在尝试这样做:

        ...

        movies = Movie.objects.filter(user_created=userlist).order_by('title')
        cartoons = Cartoon.objects.filter(user_created=userlist).order_by('title')

        all_items = list(chain(movies, cartoons))

        item = all_items.get(id=item_id)
        item.delete()

但是随后PyCharm声明了

类'list'的未解析属性引用'get'

我知道为什么会这样,但是我不知道如何避免。有什么方法可以合并来自不同模型的两个查询集,并应用get或filter而不删除抽象基础模型并创建物理父模型?

2 个答案:

答案 0 :(得分:1)

对于任意数量的不同模型,您可以使用ContentTypes framework获得通用且可重用的解决方案。但是我也想知道为什么CartoonMovie一定是不同的类型。也许值得花点时间考虑一下是否可以对两种类型的媒体都使用单个模型-删除任意实例只是许多情况下的一种,单个实例比依赖ContentTypes更为简单。< / p>

编辑:有关ContentTypes的更多信息。您可以创建具有通用关系的基本模型(您说您不想这样做),或者对于删除,可以在请求数据中将应用标签和模型名称与项目ID一起添加,从而实现如下查找:

    media_type = ContentType.objects.get(app_label=app_label, model=model_name)
    instance = media_type.get_object_for_this_type(id=item_id)
    instance.delete()

这种方法的优点是您几乎不必更改模型结构。

答案 1 :(得分:0)

您首先可以使用index()方法找到索引,然后可以通过all_items [given_index] .delete()获取项目