user1659653
user1659653

Reputation: 334

DRF Exception value: Cannot assign - it must be a instance

I know there are a bunch of questions addressing this issue, but I haven't solved it out yet. I'm using DRF for the first time and I'm working with nested serializers. My Restaurant serializer points to a Category serializer via a slug related field as it shows below

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = (
            'name',
            'description'
        )

class RestaurantSerializer(serializers.HyperlinkedModelSerializer):
    category = serializers.SlugRelatedField(
        many=True,
        read_only=False,
        queryset=Category.objects.all(),
        slug_field='name'
    )

    class Meta:
        model = Restaurant
        fields = (
            'id',
            'name',
            'description',
            'website',
            'twitter',
            'facebook',
            'instagram',
            'category'
        )

I send all the necessary data to my endpoint to create a new Restaurant via jquery but I keep getting "Cannot assign "[< Category: Italian food >]": "Restaurant.category" must be a "Category" instance."

I understand I need to assign a Category object to Restaurant's category, although I don't know how to access my queryset to extract the object that matters.

Any advices on this?

Edit: This is the data I'm sending from jquery to my endpoint

{"name":"Restaurant","email":"[email protected]","password":"1234","category":["Italian food"],"description":"Description test"}

Edit # 2 See the model definitions below

class Restaurant(models.Model):
   name = models.CharField(max_length=80, null=False)
   description = models.TextField(max_length=300, null=False)
   email = models.EmailField(max_length=80, null=True)
   password = models.CharField(max_length=60, null=False)
   website = models.URLField(max_length=80, null=True)
   twitter = models.CharField(max_length=60, null=True, blank=True)
   facebook = models.CharField(max_length=60, null=True, blank=True)
   instagram = models.CharField(max_length=60, null=True, blank=True)
   category = models.ForeignKey('Category')

   def __unicode__(self):
       return self.name


class Category(models.Model):
  name = models.CharField(max_length=80, null=False)
  description = models.TextField(max_length=100, null=False)

  def __unicode__(self):
      return self.name

Upvotes: 0

Views: 3481

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599648

You have a ForeignKey from Restaurant to Category. That means there is only one Category for each Restaurant. But you are sending a list of category slugs, and you have many=True in the definition of the SlugRelatedField.

Your data should just be {..."category": "Italian food"...}, and you should remove the many=True.

Upvotes: 4

Related Questions