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吗?
从django-2.2开始,您可以在字段的组合上使用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)
因此,这意味着该组合的name和age值应该是唯一的。所以Person(name='Alex', age=30)和Person(name='Alex', age=40)不会引发错误,而是两个对象Person(name='Alex', age=30)并Person(name='Alex', age=30)会导致错误,例如:
Run Code Online (Sandbox Code Playgroud)django.db.utils.IntegrityError: (1062, "Duplicate entry 'Alex-30' for key 'person_unique'")
在django-2.2之前,您可以使用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)
| 归档时间: |
|
| 查看次数: |
42 次 |
| 最近记录: |