Special case for when OneToOneField is also primary key. by matteius · Pull Request #5192 · encode/django-rest-framework (original) (raw)

Additionally, having tried to manually list all the fields on one of the smaller tables, I get the same error:

Traceback (most recent call last):
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/django/core/handlers/base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/Cellar/python/3.7.2/Frameworks/Python.framework/Versions/3.7/lib/python3.7/contextlib.py", line 74, in inner
    return func(*args, **kwds)
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/rest_framework/viewsets.py", line 116, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/rest_framework/views.py", line 495, in dispatch
    response = self.handle_exception(exc)
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/rest_framework/views.py", line 455, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/rest_framework/views.py", line 492, in dispatch
    response = handler(request, *args, **kwargs)
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/rest_framework/mixins.py", line 45, in list
    return self.get_paginated_response(serializer.data)
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/rest_framework/serializers.py", line 768, in data
    ret = super(ListSerializer, self).data
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/rest_framework/serializers.py", line 262, in data
    self._data = self.to_representation(self.instance)
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/rest_framework/serializers.py", line 686, in to_representation
    self.child.to_representation(item) for item in iterable
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/rest_framework/serializers.py", line 686, in <listcomp>
    self.child.to_representation(item) for item in iterable
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/rest_framework/serializers.py", line 513, in to_representation
    fields = self._readable_fields
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/django/utils/functional.py", line 37, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/rest_framework/serializers.py", line 376, in _readable_fields
    field for field in self.fields.values()
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/rest_framework/serializers.py", line 363, in fields
    for key, value in self.get_fields().items():
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/rest_framework/serializers.py", line 1059, in get_fields
    fields[field_name] = field_class(**field_kwargs)
  File "/Users/carl/.virtualenvs/diakonia-internal/lib/python3.7/site-packages/rest_framework/relations.py", line 290, in __init__
    assert self.view_name is not None, 'The `view_name` argument is required.'
AssertionError: The `view_name` argument is required.

and that's with a model of...

class Location(models.Model):
    location_cd = models.OneToOneField(CodeValue, models.DO_NOTHING, db_column='location_cd', primary_key=True)

    apache_reltn_flag = models.FloatField(editable=False, )
    census_ind = models.FloatField(editable=False, blank=True, null=True)
    chart_format_id = models.ForeignKey(ChartFormat, models.DO_NOTHING, blank=True, null=True, db_column='CHART_FORMAT_ID')
    contributor_source_cd = models.FloatField(editable=False, blank=True, null=True)
    contributor_system_cd = models.FloatField(editable=False, )
    data_status_cd = models.FloatField(editable=False, )
    data_status_dt_tm = models.DateField(editable=False, blank=True, null=True)
    data_status_prsnl_id = models.ForeignKey(Prsnl, models.DO_NOTHING, editable=False, db_column='DATA_STATUS_PRSNL_ID')
    discipline_type_cd = models.FloatField(editable=False, )
    exp_lvl_cd = models.FloatField(editable=False, blank=True, null=True)
    ref_lab_acct_nbr = models.CharField(editable=False, max_length=20, blank=True, null=True)
    facility_accn_prefix_cd = models.FloatField(editable=False, )
    icu_ind = models.FloatField(editable=False, blank=True, null=True)
    location_type_cd = models.ForeignKey(CodeValue, models.DO_NOTHING, db_column='LOCATION_TYPE_CD')
    organization_id = models.ForeignKey(Organization, models.DO_NOTHING, db_column='ORGANIZATION_ID')
    patcare_node_ind = models.FloatField(editable=False, blank=True, null=True)
    registration_ind = models.FloatField(editable=False, blank=True, null=True)
    reserve_ind = models.FloatField(editable=False, )
    resource_ind = models.FloatField(editable=False, blank=True, null=True)
    transfer_dt_tm_ind = models.FloatField(editable=False, )
    transmit_outbound_order_ind = models.FloatField(editable=False, blank=True, null=True)

    # Obsolete fields (according to the DocInfo)
    # view_type_cd = models.ForeignKey(CodeValue, models.DO_NOTHING, db_column='VIEW_TYPE_CD')
    view_type_cd = models.FloatField(editable=False, blank=True, null=True)  # Break the FK link, but see the data

    # Common date boundaries for the record
    beg_effective_dt_tm = models.DateField(editable=False, )
    end_effective_dt_tm = models.DateField(editable=False, )

    def __str__(self):
        return "Location #{0}".format(self.location_cd.display)

    class Meta:
        managed = False
        db_table = 'LOCATION'

and a serialiser of:

class LocationSerialiser(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Location
        # fields = '__all__'
        fields = ('location_cd', 'apache_reltn_flag', 'census_ind', 'chart_format_id', 'contributor_source_cd',
                  'contributor_system_cd', 'data_status_cd', 'data_status_dt_tm', 'data_status_prsnl_id',
                  'discipline_type_cd', 'exp_lvl_cd', 'ref_lab_acct_nbr', 'facility_accn_prefix_cd', 'icu_ind',
                  'location_type_cd', 'organization_id', 'patcare_node_ind', 'registration_ind', 'reserve_ind',
                  'resource_ind', 'transfer_dt_tm_ind', 'transmit_outbound_order_ind', 'view_type_cd',
                  'beg_effective_dt_tm', 'end_effective_dt_tm')

This makes me suspect the problem is a bit deeper on the OneToOneField as PK and not just related to adding in the PK to the default_fields.