lundi 23 mars 2020

UNIQUE constraint failed in django test client

I have a code like this inside tests.py:

thirduser = User(
    username = "thirduser",
    password = "12345678"
)
thirduser.save()
third_user = Profile(
    user = thirduser
)
third_user.save()

it returns the error of UNIQUE...

If I remove
third_user.save() it works. But when I want to assign it to my project as

project01 = Project(
    user = third_user,
    title = "prg01",
    description = "dsc01",
    category = cleaning,
    deadline = deadline,
    date_posted = date_posted,
    status = OPEN
)
project01.save()

Then it returns another error of

save() prohibited to prevent data loss due to unsaved related object 'user'. Note: The user for project should be from Profile model that I have in my code. and Profile model has a field named user which is from User (from django.contrib.auth.models import User)

Models:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    company = models.TextField(max_length=50, blank=True)
    phone_number = models.TextField(max_length=50, blank=True)
    country = models.TextField(max_length=50, blank=True)
    state = models.TextField(max_length=50, blank=True)
    city = models.TextField(max_length=50, blank=True)
    postal_code = models.TextField(max_length=50, blank=True)
    street_address = models.TextField(max_length=50, blank=True)
    categories = models.ManyToManyField('projects.ProjectCategory', related_name='competance_categories')
    def __str__(self):
        return self.user.username

@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
    instance.profile.save() # Saves the user profile

Project Model:

class Project(models.Model):
    user = models.ForeignKey(Profile, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    description = models.TextField(max_length=500)
    participants = models.ManyToManyField(Profile, related_name='project_participants')
    category = models.ForeignKey(ProjectCategory, on_delete=models.CASCADE, related_name='project_category')
    deadline = models.DateField(auto_now=False, auto_now_add=False,default=datetime.date.today, null=False)
    date_posted = models.DateField(editable=False, default=datetime.date.today)

    OPEN = 'o'
    INPROG = 'i'
    FINISHED = 'f'
    STATUS_CHOICES = (
        (OPEN, 'Open'),
        (INPROG, 'In progress'),
        (FINISHED, 'Finished'),
    )
    status = models.CharField(max_length=11, choices=STATUS_CHOICES, default=OPEN, )

    def __str__(self):
        return self.title
   def save(self, *args, **kwargs):
        if not self.id:
            self.date_posted = datetime.date.today()
        if self.deadline < datetime.date.today():
            raise ValidationError("The deadline cannot be in the past!",code=None)
        super(Project, self).save(*args, **kwargs)

Aucun commentaire:

Enregistrer un commentaire