rickymwethera
rickymwethera

Reputation: 25

NameError: name 'Profile' is not defined

here is my models.py code. im trying to run the python3.8 manage.py migrate command to create the tables for the database but i keep getting this error, what could be the issue here. Profile is a class in the models.py code. if you need another part of my code please ask

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone

class Image(models.Model):
    user  = models.ForeignKey(User, on_delete=models.CASCADE, null='True', blank=True)
    image = models.ImageField(upload_to = 'pics/')
    name = models.CharField(max_length=50,blank=True)      
    caption = models.CharField(max_length=250, blank=True)  
    likes =  models.ManyToManyField(User, related_name='likes', blank=True, )
    date_posted = models.DateTimeField(default=timezone.now)


class Comment(models.Model):
    comment = models.TextField()
    image = models.ForeignKey('Image', on_delete=models.CASCADE,related_name='comments',null='True', blank=True )
    name = models.CharField(max_length=100, blank=True)
    user = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='comments',null='True', blank=True )
    created = models.DateTimeField(auto_now_add=True, null=True)  

class Profile(models.Model):
    name = models.OneToOneField(User, on_delete=models.CASCADE)
    profile_picture = models.ImageField(upload_to='images/', default='default.png')
    bio = models.TextField(max_length=500, default="My Bio", blank=True)
    followers = models.ManyToManyField(User, related_name="followers", blank=True)
    following = models.ManyToManyField(User, related_name="following", blank=True)  

Upvotes: 2

Views: 3405

Answers (2)

Marko
Marko

Reputation: 779

You are using the Profile class before defining it. Switch the order of the Comment class and Profile class. Like so:

class Profile(models.Model):
    name = models.OneToOneField(User, on_delete=models.CASCADE)
    profile_picture = models.ImageField(upload_to='images/', default='default.png')
    bio = models.TextField(max_length=500, default="My Bio", blank=True)
    followers = models.ManyToManyField(User, related_name="followers", blank=True)
    following = models.ManyToManyField(User, related_name="following", blank=True)  
    
    
class Comment(models.Model):
    comment = models.TextField()
    image = models.ForeignKey('Image', on_delete=models.CASCADE,related_name='comments',null='True', blank=True )
    name = models.CharField(max_length=100, blank=True)
    user = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='comments',null='True', blank=True )
    created = models.DateTimeField(auto_now_add=True, null=True)  

Upvotes: 2

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476503

You are referencing the Profile class before this is constructed. You can make use of a string literal instead:

class Comment(models.Model):
    # …
    user = models.ForeignKey(
        'Profile',  # ← a string literal
        on_delete=models.CASCADE,
        related_name='comments',
        null='True',
        blank=True
    )
    # …

It might also be better to rename the field to profile, to make it clear the ForeignKey is referencing a Profile object, not a User object:

class Comment(models.Model):
    # …
    profile = models.ForeignKey(  # ← rename to profile
        'Profile',
        on_delete=models.CASCADE,
        related_name='comments',
        null='True',
        blank=True
    )
    # …

Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.

Upvotes: 1

Related Questions