Yespa16
Yespa16

Reputation: 51

__str__ returned non-string (type Product)

I'm getting __ str __ returned non-string (type Product) when I try to add OrderItem in my Django project

models.py:

class Order(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    date_ordered = models.DateField(auto_now_add=True, blank=True, null=True)
    complete = models.BooleanField(default=False)
    transaction_id = models.CharField(max_length=100, null=True)

    def __str__(self):
        return self.transaction_id



class OrderItem(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField(default=1)
    order = models.ForeignKey(Order, on_delete=models.CASCADE)

    def __str__(self):
        return self.product


class Product(models.Model):
     name = models.CharField(max_length=200, null=True)
     price = models.FloatField()
     image = models.ImageField(null=True, blank=True)
     tag = models.ForeignKey(Tag, on_delete=models.CASCADE, blank=True, null=True)


    def __str__(self):
         return str(self.name)


@property
def imageUrl(self):
    try:
        url = self.image.url
    except:
        url =''
    return url

admin.py:

admin.site.register(Customer)
admin.site.register(Product)
admin.site.register(Order)
admin.site.register(Tag)
admin.site.register(OrderItem)

I get the same error when I try this:

    class Product(models.Model):
     name = models.CharField(max_length=200, null=True)
     price = models.FloatField()
     image = models.ImageField(null=True, blank=True)
     tag = models.ForeignKey(Tag, on_delete=models.CASCADE, blank=True, null=True)


    def __str__(self):
         return 'test'

Sometimes I get this error when I try to add/delete items (in Orders, OrderItems, Products)

Upvotes: 0

Views: 170

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476709

The problem is not the __str__ method of the Product class, but the __str__ method of the OrderItem class. self.product is not a string, but a Product object, so you can not return this in the __str__ method. You can for example return the str(…) of the product:

class OrderItem(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField(default=1)
    order = models.ForeignKey(Order, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.product)

Upvotes: 3

Related Questions