Python 如何解决Django外部数据库的导入问题?[AssertionError:]

Python 如何解决Django外部数据库的导入问题?[AssertionError:],python,django,database,Python,Django,Database,我将外部postgreSQL数据库连接到Django,并运行inspect db将模型导入我的应用程序。迁移更改时,我遇到以下错误: python manage.py makemigrations Traceback (most recent call last): File "manage.py", line 22, in <module> main() File "manage.py", line 18, in ma

我将外部postgreSQL数据库连接到Django,并运行inspect db将模型导入我的应用程序。迁移更改时,我遇到以下错误:

    python manage.py makemigrations
Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\prateek.jain\Anaconda3\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "C:\Users\prateek.jain\Anaconda3\lib\site-packages\django\core\management\__init__.py", line 377, in execute
    django.setup()
  File "C:\Users\prateek.jain\Anaconda3\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\prateek.jain\Anaconda3\lib\site-packages\django\apps\registry.py", line 114, in populate
    app_config.import_models()
  File "C:\Users\prateek.jain\Anaconda3\lib\site-packages\django\apps\config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "C:\Users\prateek.jain\Anaconda3\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\prateek.jain\OneDrive - XTRACAP FINTECH INDIA PRIVATE LIMITED\Desktop\XtraCap\django_api\api\models.py", line 1092, in <module>
    class Holidays(models.Model):
  File "C:\Users\prateek.jain\Anaconda3\lib\site-packages\django\db\models\base.py", line 320, in __new__
    new_class._prepare()
  File "C:\Users\prateek.jain\Anaconda3\lib\site-packages\django\db\models\base.py", line 333, in _prepare
    opts._prepare(cls)
  File "C:\Users\prateek.jain\Anaconda3\lib\site-packages\django\db\models\options.py", line 254, in _prepare
    model.add_to_class('id', auto)
  File "C:\Users\prateek.jain\Anaconda3\lib\site-packages\django\db\models\base.py", line 326, in add_to_class
    value.contribute_to_class(cls, name)
  File "C:\Users\prateek.jain\Anaconda3\lib\site-packages\django\db\models\fields\__init__.py", line 2393, in contribute_to_class
    assert not cls._meta.auto_field, (
AssertionError: Model api.Holidays can't have more than one auto-generated field.
有人能帮我解决这些问题吗?

这意味着一个模型(或多个模型)包含与同一个模型的两个(或多个)关系,例如:

class AddressMaster(models.Model):
    # …
    address_owned_by = models.ForeignKey(User, on_delete=models.CASCADE)
    # …
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)
class AddressMaster(models.Model):
    # …
    address_owned_by = models.ForeignKey(
        User,
        related_name='addresses_owned'
        on_delete=models.CASCADE
    )
    # …
    created_by = models.ForeignKey(
        User,
        related_name='addresses_created'
        on_delete=models.CASCADE
    )
问题在于,对于每个这样的关系,Django都跨越了一个相反的概念关系:一种访问该用户构造/拥有的所有
AddressMaster
s的方法。默认情况下,它将使用
modelname\u set
作为该关系的名称,但由于用户有两个(或更多)的
ForeignKey
s,这意味着对于一个用户
myuser
,您因此有两个同名的关系,那么
myuser.addressmaster\u set.all()
返回什么

因此,您需要自己指定反向关系的名称。例如:

class AddressMaster(models.Model):
    # …
    address_owned_by = models.ForeignKey(User, on_delete=models.CASCADE)
    # …
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)
class AddressMaster(models.Model):
    # …
    address_owned_by = models.ForeignKey(
        User,
        related_name='addresses_owned'
        on_delete=models.CASCADE
    )
    # …
    created_by = models.ForeignKey(
        User,
        related_name='addresses_created'
        on_delete=models.CASCADE
    )
class AddressMaster(models.Model):
# …
地址_owned_by=models.ForeignKey(
用户,
相关的\u name='addresses\u owned'
on_delete=models.CASCADE
)
# …
创建人=models.ForeignKey(
用户,
相关的\u name='addresses\u已创建'
on_delete=models.CASCADE
)

以避免名称冲突。可能会有更多的冲突,因此您需要引入更多的
related\u name=…
s来解决此问题。

明白了,我该如何处理自动生成的主键问题?删除所有主键可能会导致在创建不同主键之间的关系时出现问题models@PrateekJain:你没有。在django中,只能使用一个主键。虽然它已经被多次提出,但他们从未放弃模型应该只有一个主键这一事实。这是因为其他很多东西都假设这一点,例如
DetailView
假设模型有一个主键,并且url包含该视图。我理解。我仍然感到困惑的是,我的所有模型都只有一个自动生成的键,而其他键只是用于创建关系的外键。对于我在问题的第一部分中共享的示例代码错误,这是我的模型:类假日(models.model):id=models.AutoField()description=models.CharField(max_length=50)假日=models.DateField()绕过应收=models.BooleanField(blank=True,null=True)class Meta:managed=False db_table='holidays'我没有看到两个自动生成的键here@PrateekJaoin:每个模型都需要一个主键。如果不使用主键指定字段,Django将定义字段本身,因此出现两个
AutoField
s的情况。因此,您应该将
id
标记为
primary_key=True
@PrateekJain:如果您不关心相关名称,您可以为所有冲突的
ForeignKey
s/
ManyToManyField
s/
OneToOneField
s指定
related_name='+'
,这基本上是说,它不应该产生一个反向的关系。