Django 两个外键用于同一模型



my model

class BaseModel(models.Model):
    CreatedDate = models.DateTimeField(auto_now_add=True, verbose_name="Oluşturulma Tarihi")
    ModifiedDate = models.DateTimeField(auto_now=True, verbose_name="Son Güncellenme tarihi")
    Isdeleted = models.BooleanField(verbose_name="Silindi", default=False)
class Case(BaseModel):
    CaseNumber = models.CharField(max_length=14)
    Customer = models.ForeignKey(Customer)
    Title = models.ForeignKey(CaseTitle)
    CaseCategory = models.ForeignKey(CaseCategory, verbose_name="Kategori")
    Priority = models.ForeignKey(CasePriority)
    Status = models.ForeignKey(CaseStatus)
    Detail = models.TextField()
    Group = models.ForeignKey(Group)
    User = models.ForeignKey(User,related_name='User' )
    AssignedUser = models.ForeignKey(User,related_name='AssignedUser')
    CloseDetail = models.TextField blank=True)

我只想给我 2 个外键这是我的模型,但错误是

Traceback (most recent call last):   
File "/usr/local/lib/python3.6/site-packages/django/db/models/fields/related.py", line 796, in __init__
    to._meta.model_name AttributeError: 'ForeignKey' object has no attribute '_meta'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):   
File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)   
File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
    utility.execute()   
File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 338, in execute
    django.setup()   
File "/usr/local/lib/python3.6/site-packages/django/__init__.py", line 27, in setup
    apps.populate(settings.INSTALLED_APPS)   
File "/usr/local/lib/python3.6/site-packages/django/apps/registry.py", line 108, in populate
    app_config.import_models()   
File "/usr/local/lib/python3.6/site-packages/django/apps/config.py", line 202, in import_models
    self.models_module = import_module(models_module_name)   
File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)   
File "<frozen importlib._bootstrap>", line 994, in _gcd_import   
File "<frozen importlib._bootstrap>", line 971, in _find_and_load   
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked 
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked  
File "<frozen importlib._bootstrap_external>", line 678, in exec_module   
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed   
File "/code/Case/models.py", line 91, in <module>
    class Case(BaseModel):   
File "/code/Case/models.py", line 101, in Case
    AssignedUser = models.ForeignKey(User,related_name='AssignedUser')   
File "/usr/local/lib/python3.6/site-packages/django/db/models/fields/related.py", line 802, in __init__
    RECURSIVE_RELATIONSHIP_CONSTANT, AssertionError: ForeignKey(<django.db.models.fields.related.ForeignKey>) is invalid.
First parameter to ForeignKey must be either a model, a model name, or the string 'self'

你正在重新定义User 这个轰炸的 Django 代码的相关部分是一个isinstance(to, str)这意味着User不是一个模型,但它也不是一个字符串(它是一个ForeignKey)。

如果你使用的是 Django 的用户模型或自定义变体,独立获取引用的正确方法是使用 django.contrib.auth.get_user_model() 例如:

from django.contrib.auth import get_user_model
User = get_user_model()
class MyModel(models.Model):
    user = models.ForeignKey(User)

在 Python 中,除非它们是类,否则小写名称是惯例。

如果您只实现与模型User的一个关系,它是否有效?错误消息:

First parameter to ForeignKey must be either a model, a model name, or the string 'self'

让我假设,您没有传递User模型的实际类。你如何获得它?

另外,从BaseModel领域来看,我想它可能是一个抽象的基本模型:

class BaseModel(models.Model):
    class Meta:
        abstract = True
    CreatedDate = models.DateTimeField(auto_now_add=True, verbose_name="Oluşturulma Tarihi")
    ...

有关更多信息,请参阅此处:https://godjango.com/blog/django-abstract-base-class-model-inheritance/

你应该遵循python约定如何使用大写,小写,否则解释器将引用错误的变量:

  • 类是唯一应该成为驼峰大小写的东西(class Userclass CaseTitle)。
  • 类属性(实例变量)应为小写,并带有下划线:case_number, user, assigned_user, etc...

当你写User = ForeignKey(User)时,你实际上是在重新定义User变量,所以在下一行AssignedUser = ForeignKey(User)User不再是User模型类。如果我把它写出来,我会得到:

AssignedUser = models.ForeignKey( # User
    models.ForeignKey(  # User
        models.ForeignKey(  # User etc...
            ...

将字段名称"用户"更改为所需的任何内容。它冲突,这就是您收到错误的原因。

class Case(BaseModel):
    ....
    user = models.ForeignKey(User,related_name='user' )
    assigned_user = models.ForeignKey(User,related_name='assigned_user')