0

我的表定义如下。

class Role(models.Model):

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        to_field="email",
        db_column="user",
        on_delete=models.CASCADE
    )

    vertical = models.ForeignKey(
        Verticals,
        to_field="name",
        db_column="vertical",
        on_delete=models.CASCADE
    )

    product_domain = models.ForeignKey(
        ProductDomains,
        to_field="name",
        db_column="product_domain",
        null=True,
        on_delete=models.CASCADE
    )

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=[
                'user',
                'vertical',
                'product_domain'
            ],
                name='unique-permissions-per-user')
        ]

这是生成的迁移

migrations.CreateModel(
            name='Role',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('product_domain', models.ForeignKey(db_column='product_domain', null=True, on_delete=django.db.models.deletion.CASCADE, to='verticals.ProductDomains', to_field='name')),
                ('user', models.ForeignKey(db_column='user', on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, to_field='email')),
                ('vertical', models.ForeignKey(db_column='vertical', on_delete=django.db.models.deletion.CASCADE, to='verticals.Verticals', to_field='name')),
            ],
        ),
        migrations.AddConstraint(
            model_name='role',
            constraint=models.UniqueConstraint(fields=('user', 'vertical', 'product_domain'), name='unique-permissions-per-user'),
        ),

角色模型的序列化程序是

class RoleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Role
        fields = '__all__'

这是相同的交互式控制台

链接到控制台图像(由于声誉较低,无法添加)

这里 UniqueConstraint 不起作用,为什么?我在同一个项目中多次使用 models.UniqueConstraint,但在这种情况下它不起作用。

我的配置是 Django - 3.0.4 Django Rest Framework - 3.11.0 数据库 - MySql

请帮助并询问是否缺少任何信息。

4

1 回答 1

1

您的日志没有显示任何尝试将同一记录插入数据库两次,只是验证。

看来 Django Rest Framework 没有从 导入约束UniqueConstraint,并且只有代码可以使用旧的Meta.unique_together约束定义进行验证。

在 DRF GitHub 上有一个跟踪问题ModelSerializer not generate validators for constraints,您可以在其中关注有关添加验证支持的最新更新UniqueConstraint

于 2020-04-15T14:12:45.413 回答