由属性确定的唯一数据库条目

ale*_*wis 4 python django model class unique

我有以下课程:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=200)
    age = models.CharField(max_length=200)
Run Code Online (Sandbox Code Playgroud)

我为这个类制作了两个相同的实例:

alex_1 = Person(name='Alex', age=30)
alex_1.save()
alex_2 = Person(name='Alex', age=30)
alex_2.save()
Run Code Online (Sandbox Code Playgroud)

这将在人员数据库中保存2个条目。有什么方法可以防止第二个实例(alex_2)在技术上是重复的,因此无法保存?即,您可以实现实例的__eq____hash__功能models.Model吗?

Wil*_*sem 5

,您可以在字段的组合上使用UniqueConstraint[Django-doc]

from django.db.models.constraints import UniqueConstraint

class Person(models.Model):
    name = models.CharField(max_length=200)
    age = models.CharField(max_length=200)

    class Meta:
        constraints = [
            UniqueConstraint(fields=['name', 'age'], name='person_unique')
        ]
Run Code Online (Sandbox Code Playgroud)

因此,这意味着该组合nameage值应该是唯一的。所以Person(name='Alex', age=30)Person(name='Alex', age=40)不会引发错误,而是两个对象Person(name='Alex', age=30)Person(name='Alex', age=30)会导致错误,例如:

django.db.utils.IntegrityError: (1062, "Duplicate entry 'Alex-30' for key 'person_unique'")
Run Code Online (Sandbox Code Playgroud)

之前,您可以使用unique_together[Django-doc]

class Person(models.Model):
    name = models.CharField(max_length=200)
    age = models.CharField(max_length=200)

    class Meta:
        unique_together = ['name', 'age']
Run Code Online (Sandbox Code Playgroud)