Home > OS >  Field 'id' expected a number but got <User: ben>
Field 'id' expected a number but got <User: ben>

Time:02-07

I created a population script for a django website however, after running the script and making migrations, I logged in to the django admin page for my site to access the objects created using the script and could not do it for my Business model. It works fine for my other models.

I get this error when I try to access the registered Businesses in my database from the Django admin page. It does not seem to trace back to any of my code but rather to a template in the admin folder of my python environment. Here's the error message:

error message

Here are my models:

class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
profile_pic = models.ImageField(upload_to="profile_images", blank=True, default="profile_images/default.png")
description = models.TextField(max_length=1024, default="")

# boolean flag for identifying business owners
is_business_owner = models.BooleanField(default=False)

def __str__(self):
    return self.user.username

class Business(models.Model):

owner_fk = models.ForeignKey(User, on_delete=models.CASCADE)

name = models.CharField(max_length=128)
address = models.CharField(max_length=128)
img = models.ImageField(upload_to="business_images", blank=True)

slug = models.SlugField(unique=True)

class Meta:
    verbose_name_plural = 'Businesses'

def save(self, *args, **kwargs):
    self.slug = slugify(self.name)
    super(Business, self).save(*args, **kwargs)

def __str__(self):
    return f"{self.name} owned by {UserProfile.objects.get(pk=self.owner_fk).username}"

Here is how I created the objects through the population script:

    def add_user(username, firstname, lastname, password, profile_pic, description, 
              is_business_owner):
    new_user = User.objects.get_or_create(username=username, password=password, 
              first_name=firstname, last_name=lastname)
    if new_user[1]:
        new_profile = UserProfile(user=User.objects.get(username=username))
        new_profile.profile_pic = profile_pic
        new_profile.description = description
        new_profile.is_business_owner = is_business_owner
        new_profile.save()

def add_business(owner, name, address, img):
    new_business = Business(name=name, owner_fk=User.objects.get(username=owner))
    new_business.address = address
    new_business.img = img
    new_business.save()

Any help would be appreciated, thanks.

CodePudding user response:

Your Business class has got __str__ method. You are trying to pass User object to pk (id) key.

class Business(models.Model):

    def __str__(self):
        return f"{self.name} owned by {UserProfile.objects.get(pk=self.owner_fk).username}"

Instead of searching User object in database Change it to:

return f"{self.name} owned by {self.owner_fk.username}"

because you don't have to search database for related object, just address it directly.

  •  Tags:  
  • Related