如何对相同模型使用唯一约束

Moh*_*ari 5 python django django-models

我只想为同一用户创建一个对象。

class MyModel(models.Model):
    user1 = models.ForeignKey(settings.AUTH_USER_MODEL,...)
    user2 = models.ForeignKey(settings.AUTH_USER_MODEL,...)

    class Meta:
        constraints = [
            UniqueConstraint(
                fields=['user1', 'user2'],
                name='user_unique',
            ),
            # UniqueConstraint(
            #     fields=['user2', 'user1'],
            #     name='user_unique2',
            # ),

        ]
Run Code Online (Sandbox Code Playgroud)

我可以用另一种方式解决这个问题,我只是想知道如何用UniqueConstraint.

添加另一个 UniqueConstraint 并移动字段并不能解决问题。

例如,对于用户 X 和 Y,我只需要一个对象。

Abd*_*kat 3

由于 Django 4.0 约束现在支持表达式,这允许我们在约束中使用数据库函数,从而允许我们使用排序字段创建唯一约束:

from django.db.models.functions import Least, Greatest


class MyModel(models.Model):
    user1 = models.ForeignKey(settings.AUTH_USER_MODEL,...)
    user2 = models.ForeignKey(settings.AUTH_USER_MODEL,...)

    class Meta:
        constraints = [
            UniqueConstraint(
                Least("user1", "user2"), Greatest("user1", "user2"),
                name='user_unique',
            )
        ]
Run Code Online (Sandbox Code Playgroud)