0

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:

1 Answer 1

1

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.