запросить дополнительные поля из связанного объекта в наборе запросов django - PullRequest
0 голосов
/ 28 февраля 2019

скажем, у меня есть две модели, Parent и Child.

Child модель имеет отношение fk к Parent

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

Я хочу написатьнабор запросов для Child и сериализацию его для geojson, однако, я бы также хотел, чтобы набор запросов включал некоторые дополнительные поля из Parent помимо id.возможно, мне неясно 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(...) throws:

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:

1 Ответ

0 голосов
/ 28 февраля 2019

Ваше недоразумение в том, что это не имеет ничего общего с select_related.Этот метод предназначен только для более эффективных запросов и никак не повлияет на то, какие данные возвращаются из сериализатора.

Встроенные сериализаторы Django очень просты и не поддерживают подобные вложенные объекты.Если это то, что вам нужно, вы должны использовать Django REST Framework, который реализует гораздо более полнофункциональные сериализаторы, которые могут сериализовать вложенные объекты различными способами.

...