Django:AttributeError:'UniqueConstraint'对象没有'fields_orders'属性

3
我在我的应用程序中有一个名为“Employment”的模型,它引用了两个名为“User”和“Company”的模型。在数据库的Employments表中,有一个复合索引,防止同一用户在同一公司拥有两个Employment。我正在尝试使用UniqueConstraint类在Django中表示这个复合索引,但它会抛出一个错误,我找不到任何文档来说明这个问题。
这个模型通常运行得非常好。然而,当我将UniqueConstraint加入到模型的索引中时,服务器就会抛出一个错误。我已经查看了UniqueConstraint的文档,以及Django的其他文档,但是没有找到我收到的错误的任何提及。我也尝试在UniqueConstraint的fields参数中使用'user'和'company'代替'User_ID'和'Company_ID',但是我得到了完全相同的错误。
不确定这是否与问题相关,但我正在使用Docker在python:3.6容器中运行Django服务器,Django版本为2.2。
以下是Employment模型:
from django.db import models
from app.models import User, Company

class Employment(models.Model):
    Employment_ID = models.AutoField(primary_key=True)
    user          = models.ForeignKey(User, db_column='User_ID', on_delete=models.CASCADE)
    company       = models.ForeignKey(Company, db_column='Company_ID', on_delete=models.CASCADE)

    class Meta:
        db_table = "Employments"
        indexes = [
            models.UniqueConstraint(fields=['User_ID', 'Company_ID'],
                                    name='Employment_User_Company_UNIQUE') # server works fine without this
        ]

当我启动Django服务器时,会出现以下输出:
Watching for file changes with StatReloader
Performing system checks...

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/local/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/utils/autoreload.py", line 54, in wrapper
    fn(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/commands/runserver.py", line 117, in inner_run
    self.check(display_num_errors=True)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 390, in check
    include_deployment_checks=include_deployment_checks,
  File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 377, in _run_checks
    return checks.run_checks(**kwargs)
  File "/usr/local/lib/python3.6/site-packages/django/core/checks/registry.py", line 72, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/usr/local/lib/python3.6/site-packages/django/core/checks/model_checks.py", line 31, in check_all_models
    errors.extend(model.check(**kwargs))
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 1254, in check
    *cls._check_indexes(),
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 1565, in _check_indexes
    fields = [field for index in cls._meta.indexes for field, _ in index.fields_orders]
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 1565, in <listcomp>
    fields = [field for index in cls._meta.indexes for field, _ in index.fields_orders]
AttributeError: 'UniqueConstraint' object has no attribute 'fields_orders'

如果有人遇到这个错误或知道解决方法,请您分享一下,非常感谢您的帮助。
1个回答

4
你已经在 indexes 参数中定义了这个,但是它应该在 constraints [Django-doc] 属性中。 indexes 包含了表上定义的索引列表,而另一方面,constraints 包含了应该被强制实施的约束条件。
class Employment(models.Model):
    Employment_ID = models.AutoField(primary_key=True)
    user = models.ForeignKey(User, db_column='User_ID', on_delete=models.CASCADE)
    company = models.ForeignKey(Company, db_column='Company_ID', on_delete=models.CASCADE)

    class Meta:
        db_table = "Employments"
        <b>constraints</b> = [
            models.UniqueConstraint(
                fields=['User_ID', 'Company_ID'],
                name='Employment_User_Company_UNIQUE'
            )
        ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接