首页 > 解决方案 > 从 django 查询集中的相关对象请求附加字段

问题描述

假设我有两个模型,Parent并且Child.

Child模型与Parent

Class Child(models.Model):
     parent = models.ForeignKey('Parent', related_name='family')

我想为geojson编写一个查询Child集并将其序列化为geojson,但是,我还希望查询集包含Parentid之外的一些附加字段。也许我不清楚select_related()

这提供了功能相同的查询,没有来自 Parent 的附加字段:

qs = Child.objects.filter(...).select_related('parent')

props = {
    'geoJson' : serializers.serialize('geojson', list(qs)),
}

如果我.select_related('parent').values(...)为我想要的字段制作它,req 上的视图会出错:

'dict' object has no attribute '_meta'

.select_related('parent').only(...)抛出:

Field Child.parent cannot be both deferred and traversed using select_related at the same time

构造该查询集以从相关对象请求额外字段的正确方法是什么?我selected_related在查询中有什么误解?谢谢

.values() 回溯:

File ".pyenv/versions/3.6.3/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File ".pyenv/versions/3.6.3/lib/python3.6/site-packages/django/core/handlers/base.py" in _legacy_get_response
  249.             response = self._get_response(request)

File ".pyenv/versions/3.6.3/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File ".pyenv/versions/3.6.3/lib/python3.6/site-packages/channels/handler.py" in process_exception_by_middleware
  237.             return super(AsgiHandler, self).process_exception_by_middleware(exception, request)

File ".pyenv/versions/3.6.3/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File ".pyenv/versions/3.6.3/lib/python3.6/contextlib.py" in inner
  52.                 return func(*args, **kwds)

File "project/utils/helpers.py" in _decorated
  29.             return view(request, *args, **kwargs)

File ".pyenv/versions/3.6.3/lib/python3.6/site-packages/htmlmin/decorators.py" in minify
  13.         response = f(*args, **kwargs)

File "/causes/views.py" in cause
  197.         'activityJson' : serializers.serialize('geojson', list(qs)),

File ".pyenv/versions/3.6.3/lib/python3.6/site-packages/django/core/serializers/__init__.py" in serialize
  129.     s.serialize(queryset, **options)

File ".pyenv/versions/3.6.3/lib/python3.6/site-packages/django/core/serializers/base.py" in serialize
  81.             self.start_object(obj)

File ".pyenv/versions/3.6.3/lib/python3.6/site-packages/django/contrib/gis/serializers/geojson.py" in start_object
  35.             for field in obj._meta.fields:

标签: djangodjango-modelsdjango-queryset

解决方案


您的误解是,这与 . 没有任何关系select_related。该方法仅用于进行更有效的查询,并且不会以任何方式影响从序列化程序返回的数据。

Django 内置的序列化器非常基础,不支持这样的嵌套对象。如果这就是你想要的,你应该使用 Django REST 框架,它实现了功能更全的序列化器,可以以多种方式序列化嵌套对象。


推荐阅读