Reputation: 1575
say I've got two models, Parent
and Child
.
Child
model has a fk relation to Parent
Class Child(models.Model):
parent = models.ForeignKey('Parent', related_name='family')
I want to write a queryset for Child
and serialize it to geojson, however, I'd also like the queryset to include some additional fields from Parent
beyond id. perhaps I'm not clear on select_related().
This offers functionally the same query with no additional fields from Parent:
qs = Child.objects.filter(...).select_related('parent')
props = {
'geoJson' : serializers.serialize('geojson', list(qs)),
}
if I make it .select_related('parent').values(...)
for the fields I want, the view errs on 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
what's the right way to structure that queryset to request extra fields from the related object? what am I misunderstanding about selected_related
in queries? thanks
.values() Traceback:
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:
Upvotes: 0
Views: 477
Reputation: 599480
Your misunderstanding is that this doesn't have anything whatsoever to do with select_related
. That method is for making more efficient queries only, and would not in any way affect what data is returned from a serializer.
Django's built-in serializers are very basic, and don't support nested objects like this. If that's what you want, you should use Django REST Framework, which implements much more fully-featured serializers which can serialize nested objects in a variety of ways.
Upvotes: 1