Will
Will

Reputation: 11500

Django-Rest-Framework 3.0 Field name '<field>' is not valid for model `ModelBase`

Error Message

I just tried out the Django-Rest-Framework 3.0 quickstart tutorial (great intro btw) and ran into this error when implementing it on my own system/table.

ImproperlyConfigured at /calls/
Field name `Datecreated` is not valid for model `ModelBase`.

I googled it quickly and couldn't find anything so I wanted to save this solution in case someone else (that's also completely new) runs into the same issue. I pasted the full code since if you're stuck on this issue, you're probably new and might be able to use this to see how it all fits together.

Table 'CallTraceAttempts'

     CallTraceAttemptId  DateCreated ...
   1              95352  2009-04-10 04:23:58.0000
   2              95353  2009-04-10 04:24:08.0000

Code

### models.py in the 'lifeline' app
from __future__ import unicode_literals
from django.db import models

class CallTraceAttempts(models.Model):

    # Change these fields to your own table columns
    calltraceattemptid = models.FloatField(db_column='CallTraceAttemptId', blank=True, null=True, primary_key=True)  # Field name made lowercase.
    datecreated = models.DateTimeField(db_column='DateCreated', blank=True, null=True)  # Field name made lowercase.

    class Meta:
        managed = False # I don't want to create or delete tables
        db_table = 'CallTraceAttempts'  # Change to your own table


### urls.py
from django.conf.urls import patterns, include, url
from lifeline.models import CallTraceAttempts  # Change to your app instead of 'lifeline'
from rest_framework import routers, serializers, viewsets

# Serializers define the API representation
class CallTraceAttemptsSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = CallTraceAttempts
        fields = ('calltraceattemptid', 'Datecreated')

# ViewSets define the view behavior
class CallTraceAttemptsViewSet(viewsets.ModelViewSet):
    queryset = CallTraceAttempts.objects.all()
    serializer_class = CallTraceAttemptsSerializer

# Routers provide an easy way of automatically determining the URL conf
router = routers.DefaultRouter()
router.register(r'calls', CallTraceAttemptsViewSet)

urlpatterns = patterns('',
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
)

Upvotes: 34

Views: 37528

Answers (2)

Will
Will

Reputation: 11500

The issue happens under urls.py's 'fields'. Make sure that the fields in your serializer match exactly (case sensitive) to the field in your models.py.

### urls.py    
#...
# Serializers define the API representation
class CallTraceAttemptsSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = CallTraceAttempts
        fields = ('calltraceattemptid', 'datecreated')   ### Issue was right here, earlier version had 'Datecreated'

Upvotes: 42

Vijay
Vijay

Reputation: 317

class CallTraceAttemptsSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = CallTraceAttempts
        fields = '__all__'

Change the fields Value to 'all', it takes all fields value

Upvotes: 2

Related Questions