1

I am getting a strange error in Django 1.8:

'AutoField' object has no attribute 'remote_field'

I have a model like:

from django.db import models
from django.utils import timezone


class Event(models.Model):
    product_type = models.CharField(max_length=250, null=False, blank=False)
    received_time = models.DateTimeField(editable=False)
    source_json = models.TextField()
    event_id = models.CharField(max_length=250, null=False, blank=False)

    # https://stackoverflow.com/questions/1737017/django-auto-now-and-auto-now-add
    def save(self, *args, **kwargs):
        if not self.id:
            self.received_time = timezone.now()
        return super(Event, self).save(*args, **kwargs)

    @classmethod
    def event_id_is_already_saved(cls, event_id_in_question):
        items_found = cls.objects.filter(event_id=event_id_in_question)
        if items_found:
            return True
        return False

views like:

import json

from django.http import HttpResponse
from rest_framework import viewsets

from events.utils.elastic_db_utils import get_elastic_exact_search_from_query_dictionary
from events.serializers import EventSerializer
from events.models import Event


def list_events(request):
    all_events = Event.objects.all()
    serialized = [EventSerializer(event) for event in all_events]
    return HttpResponse(json.dumps(serialized))


class EventViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = Event.objects.all().order_by('-received_time')
    serializer_class = EventSerializer

urls:

from django.conf.urls import url, include
from rest_framework import routers

from . import views

router = routers.DefaultRouter()
router.register(r'events', views.EventViewSet)


urlpatterns = [
    url(r"^$", views.search_elastic_db, name='search-elastic-db'),
    url(r"^events", views.list_events, name='list-events'),
    url(r'^api/', include(router.urls)),
]

Neither my viewset, nor the ^events endpoint work, both get same error. There is nothing wrong with my model that you can see in a shell:

In [1]: from events.models import Event

In [2]: Event.objects.all()
Out[2]: [<Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>, <Event: Event object>]
halfer
  • 19,824
  • 17
  • 99
  • 186
codyc4321
  • 9,014
  • 22
  • 92
  • 165

1 Answers1

3

I don't think you can deduce the exact cause from the code you've provided, but based on the error message, it seems likely you're using code elsewhere—likely in a third-party library—that was written for newer versions of Django. The remote_field attribute was added to Field in Django v1.9, as noted in the release notes. (This attribute is clearly absent in v1.8.)

Your options are:

  1. Upgrade your project to a more recent Django release.
  2. Backport the third-party library, change the offending Field to use rel, and rewrite any other incompatible code.
  3. Replace the third-party library with a different one that supports Django v1.8.

(I'd recommend the first option, since upgrading between Django versions is well-documented.)

Jacob Budin
  • 9,753
  • 4
  • 32
  • 35