Cannot assign "'Sample Category'": "Product.category" must be a "Category" instance

Viewed 30

While creating new products I'm getting such kind of error. Can someone help me?

class Product(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    name_geo = models.CharField(max_length=200, null=True, blank=True)
    image = models.ImageField(null=True, blank=True, default='/placeholder.png')
    brand = models.CharField(max_length=200, null=True, blank=True)

    category = models.ForeignKey(Category, null=False, default=0, on_delete=models.CASCADE)

    price = models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True)

    countInStock = models.IntegerField(null=True, blank=True, default=0)
    createdAt = models.DateTimeField(auto_now_add=True)
    _id = models.AutoField(primary_key=True, editable=False)

    def __str__(self):
        return self.name_geo
class Category(models.Model):
    _id = models.AutoField(primary_key=True, editable=False)
    name = models.CharField(max_length=200, null=True, blank=True)
    createdAt = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name
@api_view(['POST'])
def createProduct(request):
    user = request.user
    
    product = Product.objects.create(
        user=user,
        name_geo="Sample Name",
        category="Sample Category",
        price=0,
        brand='Sample Brand',
        countInStock=0,
    )

    serializer = ProductSerializer(product, many=False)
    return Response(serializer.data)

Without separating category class in models.py everything works fine. I mean If i didn't use ForeignKey in Products class for category

1 Answers

It just has to be a Category Instance/Object

product = Product.objects.create(
    user=user,
    name_geo="Sample Name",
    category=Category.objects.get_or_create(name="Sample Category"),
    price=0,
    brand='Sample Brand',
    countInStock=0,
)

Notes:

  • You could just do a .get() or a .filter().first() if you don't want to create
  • If you use a form, you can get away with just the Category's PK/_id in the POST
    • this type of thing: f = form(request.POST) f.is_valid() f.save()
  • At the end that field will hold the PK/_id/Row# of the Category Obj
Related