Python 如何解决Django外部数据库的导入问题?[AssertionError:]
我将外部postgreSQL数据库连接到Django,并运行inspect db将模型导入我的应用程序。迁移更改时,我遇到以下错误: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
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='+'
,这基本上是说,它不应该产生一个反向的关系。