检查 Django 中的约束

问题描述 投票:0回答:1

我想在我的会员应用程序中包含我的模型的检查约束,其中性别字段应该是男性、女性或空。这是我的代码:

from django.db import models
from django.db.models import CheckConstraint, Q

# Create your models here.
class Member(models.Model):
    firstname = models.CharField(max_length=255)
    lastname = models.CharField(max_length=255)
    telephonenum = models.IntegerField(null=True)
    sex = models.CharField(max_length=10, null=True)
    CheckConstraint(check=Q((sex == "Female") | (sex == "Male")), name="check_sex")

此代码不起作用,我仍然可以使性字段不同于女性或男性。

我已经尝试过这段代码,但它也不起作用:

from django.db import models

# Create your models here.
human_sex = (
    ("1", "Woman"),
    ("2", "Man"),
)

class Member(models.Model):

    firstname = models.CharField(max_length=255)
    lastname = models.CharField(max_length=255)
    telephonenum = models.IntegerField(null=True)
    sex = models.CharField(max_length=10, choices=human_sex, null=True)
django enums check-constraints
1个回答
0
投票

您将约束列在模型的

constraints
中名为
Meta
的列表中。您还错误地使用了
Q
对象,它应该用作参数名称,例如:

class Member(models.Model):
    firstname = models.CharField(max_length=255)
    lastname = models.CharField(max_length=255)
    telephonenum = models.IntegerField(null=True)
    sex = models.CharField(max_length=10, null=True)

    class Meta:
        constraints = [
            CheckConstraint(
                check=Q(sex='Female') | Q(sex='Male'), name='check_sex'
            )
        ]

Django 默认情况下不会在数据库级别强制执行选择,因此只有

ModelForm
和序列化器会检查这一点。没有进行大量自我推销的目的,我制作了一个小包,可以在数据库级别强制执行字段选择,名为
django-enforced-choices
 [GitHub]
。安装包后,您可以使用以下命令将 mixin 添加到您的模型中:

from django.db import models
from django_enforced_choices.models import ChoicesConstraintModelMixin

# Create your models here.
human_sex = (
    ('1', 'Woman'),
    ('2', 'Man'),
)


class Member(ChoicesConstraintModelMixin, models.Model):

    firstname = models.CharField(max_length=255)
    lastname = models.CharField(max_length=255)
    telephonenum = models.IntegerField(null=True)
    sex = models.CharField(max_length=10, choices=human_sex, null=True)

这将自动添加我们在第一个代码片段中显式添加的约束。

© www.soinside.com 2019 - 2024. All rights reserved.