【问题标题】:Creating models.UniqueConstraint in django, but the constraint is not applying在 django 中创建 models.UniqueConstraint,但约束不适用
【发布时间】:2020-04-13 16:10:46
【问题描述】:

我的表定义如下。

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__'

这是相同的交互式控制台

Link to console image(由于声誉较低,无法添加)

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

我的配置是 Django - 3.0.4 Django 休息框架 - 3.11.0 数据库 - MySql

请帮忙询问是否遗漏了任何信息。

【问题讨论】:

  • 请添加更多关于什么不起作用的信息。你看到错误了吗?或者您可以显示一个插入两个冲突记录的 shell 会话吗?迁移工作正常吗?
  • 你好@AdamJohnson,我用更多信息更新了这个问题,请检查它并询问是否有任何遗漏,至于我没有收到任何错误,相同的记录被插入到数据库中并且是迁移工作正常。

标签: django django-models django-rest-framework django-mysql


【解决方案1】:

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

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

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

【讨论】:

  • I use models.UniqueConstraint in the same project many times but it doesn't work in this case. DRF 接受 models.UniqueConstraint。
  • 对不起,我在这里帮不上忙:/
  • meta.unique_together 已被弃用。是的,相同的碰撞数据被保存了两次。谢谢@Admam Johnson
猜你喜欢
  • 2019-11-30
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 2018-08-18
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
相关资源
最近更新 更多