2

I have the following models:

class Project(models.Model):
    """ Handles the user projects """
 #--> Fields
    name = models.CharField(
        verbose_name = ('Name'),
        max_length   = 300,
        help_text    = ('The name of the project.'),
    )
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, 
        on_delete    = models.CASCADE,
        related_name = 'project_user',
        verbose_name = ('Created by'),
        help_text    = ('User that created this project.')
    )
    date = models.DateTimeField(
        verbose_name = ('Creation Date'),
        default      = timezone.now,
        help_text    = ('The project creation date.')
    )

class ProjectUser(models.Model):
    """ To link users to projects from other users """
 #--> Fields
    project = models.ForeignKey(
        'Project',
        on_delete    = models.CASCADE,
        related_name = 'projectuser_project',
        verbose_name = ('Project'),
    )
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, 
        on_delete    = models.CASCADE,
        related_name = 'projectuser_user',
        verbose_name = ('Link to'),
        help_text    = ('User to link with this project'),
    )
    link_by = models.ForeignKey(
        settings.AUTH_USER_MODEL, 
        on_delete    = models.CASCADE,
        related_name = 'projectuser_link_by',
        verbose_name = ('Linked by'),
        help_text    = ('User creating the link'),
    )
    date = models.DateTimeField(
        verbose_name = ('Link Date'),
        default      = timezone.now,
        help_text    = ('Link creation date.'),
    )

Now in ProjectUser, I want to add a constraint to avoid adding a link between a project and the user that created the project. But I cannot manage to set up the Q object. The first constraint in the Meta class works as expected.

Any advice?

class Meta:
    """ """
    constraints = [
        models.UniqueConstraint(
            fields = ['project', 'user'],
            name   = 'no_repeated_link',
        ),
        models.CheckConstraint(
            check = ~Q('project__user'=='user'),
            name  = 'no_creator_link',
        ),
    ]
kbr85
  • 1,416
  • 12
  • 27
  • this check constraint should be applied in the database, how do you see it? – Brown Bear Nov 25 '19 at 08:37
  • 1
    @BearBrown I want to avoid adding an entry in the Table for ProjectUser in which ProjectUser.user.id == ProjectUser.project.user.id – kbr85 Nov 25 '19 at 08:44

0 Answers0