以下是简化的模型定义

class Resource(models.Model):
    name = models.CharField(max_length=100, unique=True)

class Location(models.Model):
    name = models.CharField(max_length=100, unique=True)
    resources = models.ManyToManyField(Resource)

我想知道一种类型的Resource,在每一种Location上的存在.所以我想要的json数据如下所示

[
    {
        "id": 1,
        "name": "loaction_A",
        "resource": true
    }, 
    {
        "id": 2
        "name": "location_B",
        "resource": false
    },
    ...
]

我try 了跟踪视图函数,但显然得到了错误的结果.

def resource_view(request, res_id):
    res = get_object_or_404(Resource, pk=res_id)
    locations = Location.objects.values('id', 'name')\
        .annotate(resource=Q(resources=res))
    return JsonResponce({'locations': list(locations)})

我知道我需要类似下面这样的东西(在SQL中)

select
    app_location.*,
    1 in (
        select resource_id
        from app_location_resources
        where location_id = app_location.id
    ) as resource
from app_location

我应该如何构造查询集?

推荐答案

一种稍微更有效的方法可能是:

from django.db.models import Exists, OuterRef

locations = Location.objects.annotate(
    resource=Exists(
        Location.resources.through.objects.filter(
            location_id=OuterRef('pk'), resource_id=res_id
        )
    )
)

不过,我建议用户使用合适的串行化程序,比如Django REST框架,或许可以使用Django REST框架:然后串行化程序可以双向工作,例如使以逗号分隔值(.csv)格式呈现数据成为可能.

Django相关问答推荐

使用FormWizard将信息从视图传递到表单

以特定顺序获取模型实例时出现问题

RDBMS多对多关系Django

在生成的表单元素处出现多值DictKeyError

如何将多个模型添加到单个列表视图?

在 django 中使用自定义 url 转换器传递 url 参数

Django 模型 Select - 只允许管理界面上的特定转换

查询 django 模型以找到当月最好的公司销售

使用 Python/Django 上传大文件

Django 模板文件夹

什么时候在 django rest 框架序列化程序中调用创建和更新?

在 Django 中提供大文件(高负载)

UnicodeDecodeError:asciicodec can't decode byte 0xe0 in position 0: ordinal not in range(128)

在 django 模板中遇到 user.is_authenticated 问题

Django:在模型管理器中获取模型的表名?

如何在 Django 中向 ChoiceField 添加class?

Django 模板和变量属性

如何获取经过身份验证的用户列表?

python/django中setattr和对象操作的区别

如何在 Python 中运行另一个脚本而不等待它完成?