0

Here is models

class Event(models.Model):
    calendar = models.ForeignKey(Calendar)
    title = models.CharField()

class Calendar(models.Model):
    title = models.CharField()

Here is serializers

class EventSerializer(models.Model):
    calendarId = serializers.CharField(source='calendar.id')
    class Meta:
        model = Event
        fields = ('id', 'title', 'calendarId')

class CalendarSerializer(models.Model):
    class Meta:
        model = Calendar
        fields = ('id', 'title')

Then I try to post below json to create an event under calendar 3b60a22c-d46e-46ca-b978-ec81a8b47fcb

{
    title:"abc",
    calendarId:"3b60a22c-d46e-46ca-b978-ec81a8b47fcb"
}

It failed with below error

ValueError: Cannot assign "{u'id': u'3b60a22c-d46e-46ca-b978-ec81a8b47fcb'}": "Event.calendar" must be a "Calendar" instance.

How to fix this issue?

Yuwen Yan
  • 4,777
  • 10
  • 33
  • 63
  • 1
    See the accepted answer in here http://stackoverflow.com/questions/29950956/drf-simple-foreign-key-assignment-with-nested-serializers – fixmycode Sep 19 '15 at 03:27

2 Answers2

0

views.py

class EventViewSet(viewsets.ModelViewSet):
      serializer_class = EventSerializer
      queryset = Event.objects.all()

    def create(self, request, format=None):
        calendarId = request.data.get("calendarId", None)
        del request.data["calendarId"]
        calendar = Calendar.objects.get(id=calendarId)
        request.data["calendar"] = calendar
        serializer = EventSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer..errors, status=status.HTTP_400_BAD_REQUEST)
        
    
Community
  • 1
  • 1
Seenu S
  • 3,381
  • 6
  • 30
  • 45
0

I assume you've created class EventSerializer(serializers.ModelSerializer)--(but i your question you wrote EventSerializer(models.Model)).

Anyway you should post your data like this:

{
    title:"abc",
    calendar:"3b60a22c-d46e-46ca-b978-ec81a8b47fcb"
}

and if doesn't work you should fill calendar field with calendar object

 def create(self, request, format=None):
      calendarId = request.data.get("calendarId", None)
      calendar = Calendar.objects.get(id=calendarId)
      request.data["calendar"] = calendar
      ...
       ..
        .
Amir Masnouri
  • 71
  • 1
  • 3