citusdata / django-multitenant

Python/Django support for distributed multi-tenant databases like Postgres+Citus
MIT License
710 stars 116 forks source link

psycopg2.errors.InvalidForeignKey: there is no unique constraint matching given keys for referenced table "users_employer" #94

Closed RoadRunner11 closed 2 years ago

RoadRunner11 commented 3 years ago

I have my tenant model as this

class Company(TenantModel):
    tenant_id = "id"
    name =   models.CharField(max_length=50)
    address =  models.CharField(max_length=255)
    description            = models.TextField(blank=True, null=True)
    email                  = models.CharField(max_length=255, blank=True, null=True) 
    subdomain_prefix       =  models.CharField(max_length=255, blank=True, null=True)
    cell_phone             = models.CharField(max_length=255, blank=True, null=True) 
    active                 = models.BooleanField(default=True)
    land_phone             = models.CharField(max_length=255, blank=True, null=True) 
    country                = models.CharField(max_length=32, choices=COUNTRY_CHOICES, blank=True)
    state                  = models.CharField(max_length=255, blank=True, null=True) 
    city                   = models.CharField(max_length=255, blank=True, null=True) 
    zip_code               = models.CharField(max_length=255, blank=True, null=True) 
    about                  = models.TextField(blank=True, null=True)
    contact_details        = models.TextField(blank=True, null=True)
    latitude               = models.CharField(max_length=512, blank=True, null=True)  
    longitude              = models.CharField(max_length=512, blank=True, null=True)  
    year_established       =  models.DateField( blank=True, null=True)
    total_employees        =  models.CharField(max_length=255, blank=True, null=True) 
    business_type          =  models.CharField(max_length=255, blank=True, null=True)  
    main_products          =  models.CharField(max_length=255, blank=True, null=True) 
    total_annual_revenue   =  models.CharField(max_length=255, blank=True, null=True) 
    url                    =  models.CharField(max_length=255, blank=True, null=True) 
    social_link            =  models.CharField(max_length=255, blank=True, null=True) 

    def __str__(self):
        return self.name

class UserProfile(TenantModel):
    is_admin = models.BooleanField(default=False)
    title = models.CharField(max_length=255, blank=True, null=True) 
    last_name = models.CharField(max_length=255, blank=True, null=True) 
    first_name = models.CharField(max_length=255, blank=True, null=True) 
    other_names = models.CharField(max_length=255, blank=True, null=True) 
    address = models.CharField(max_length=255, blank=True, null=True) 
    tenant_id = 'company_id'

    class Meta:
        abstract = True

class SuperAdmin(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True)

class Action(models.Model):
    action = models.TextField(null=True, blank=True)
    time = models.DateTimeField(auto_now=True)
    by =  models.ForeignKey(SuperAdmin, on_delete=models.CASCADE, blank=True, null=True)

class Employer(UserProfile):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employerprofile', blank=True, null=True)
    company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='employercompany', blank=True, null=True, unique=True)
    # departments = models.ManyToManyField('Department', blank=True, related_name="members")
    # class Meta: 
    #     unique_together = ["id", "company"]

class Employee(UserProfile):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employeeprofile', blank=True, null=True)
    company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='employeecompany', blank=True, null=True)
    departments = models.ManyToManyField(Department, blank=True)
    employer = TenantForeignKey(Employer,  on_delete=models.PROTECT, blank=True, null=True)
    reg_id = models.CharField(max_length=255, blank=True, null=True) 
    role = TenantForeignKey("company.Role",  on_delete=models.PROTECT, blank=True, null=True)
    leave_day = TenantForeignKey("company.LeaveDays",  on_delete=models.PROTECT, blank=True, null=True)
    identidication_type = models.CharField(max_length=255, blank=True, null=True) 
    passport = models.CharField(max_length=255, blank=True, null=True) 
    identidication = models.CharField(max_length=255, blank=True, null=True) 
    employment_type = models.CharField(max_length=255, blank=True, null=True) 
    known_as = models.CharField(max_length=255, blank=True, null=True) 
    gender = models.CharField(max_length=255, blank=True, null=True) 
    date_of_birth = models.DateField( blank=True, null=True)
    blood_group = models.CharField(max_length=255, blank=True, null=True) 
    genotype = models.CharField(max_length=255, blank=True, null=True) 
    employee_photo = models.FileField(upload_to='assets/',blank=True, null=True) 
    start_date = models.DateField( blank=True, null=True)
    reports_to = models.ForeignKey(User, on_delete=models.CASCADE, related_name='reportperson', blank=True, null=True)
    additional_reports = models.FileField(upload_to='assets/%d',blank=True, null=True) 
    job_role = models.CharField(max_length=255, blank=True, null=True) 
    salary = models.FloatField( blank=True, null=True)
    daily_cost_of_absence = models.FloatField( blank=True, null=True)
    nationality = models.CharField(max_length=255, blank=True, null=True) 

    def get_full_name(self):
            return self.user.first_name+" "+self.user.last_name

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

After creating migrations, when i try ti migrate, I get this error django.db.utils.ProgrammingError: there is no unique constraint matching given keys for referenced table "users_employer" Kindly look into it for me.

finch-wren commented 2 years ago

Did you solve this issue? I am currently facing it :(

JelteF commented 2 years ago

Closing since a fix for this is now merged and will be part of the next release.

JelteF commented 2 years ago

This was fixed in 2.4.0