【问题标题】:Correct Usage of Django Related Fields正确使用 Django 相关字段
【发布时间】:2017-04-11 02:49:11
【问题描述】:

Django 模型的一个方面是我根本不了解的相关领域,以及如何正确使用它们。我认为这反映了对 SQL 和数据库的一般理解不足 - 所以我怀疑这是许多 django 用户的问题。

在我当前的代码中,我正在构建一个旅游应用程序,因此我将住宿作为模型。然后我有路线。一天的路线最终是一堆关系字段,但让我感到困惑的是,我需要一个开始住宿和一个结束住宿 - 两个独立的关系。

对我来说,从逻辑上讲,我应该能够有一个 OneToOneField - start_accom 到住宿,然后 end_accom 到住宿。但是这样做会引发错误。

代码:

class Route(models.Model):                                                                                                  
    start_accom = models.OneToOneField(                                                                                     
        Accommodation,                                                                                                      
        on_delete=models.CASCADE,                                                                                           
        primary_key=True,                                                                                                   
    )                                                                                                                       
    end_accom = models.OneToOneField(                                                                                                                                                                             
        Accommodation,                                                                                                      
        on_delete=models.CASCADE,                                                                                           
    )                                                                                                                       
    mode_of_travel = models.CharField(max_length=50)                                                                        
    description = models.TextField()  

以及我运行 django runserver 时的错误信息:

Performing system checks...

Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x103ecdd90>
Traceback (most recent call last):
  File "/Users/vernonswanepoel/.virtualenvs/tour/lib/python3.6/site-packages/django/utils/autoreload.py", line 226, in wrapper
    fn(*args, **kwargs)
  File "/Users/vernonswanepoel/.virtualenvs/tour/lib/python3.6/site-packages/django/core/management/commands/runserver.py", line 121, in inner_run
    self.check(display_num_errors=True)
  File "/Users/vernonswanepoel/.virtualenvs/tour/lib/python3.6/site-packages/django/core/management/base.py", line 431, in check
    raise SystemCheckError(msg)
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:

ERRORS:
company.Route.end_accom: (fields.E304) Reverse accessor for 'Route.end_accom' clashes with reverse accessor for 'Route.start_accom'.
        HINT: Add or change a related_name argument to the definition for 'Route.end_accom' or 'Route.start_accom'.
company.Route.end_accom: (fields.E305) Reverse query name for 'Route.end_accom' clashes with reverse query name for 'Route.start_accom'.
        HINT: Add or change a related_name argument to the definition for 'Route.end_accom' or 'Route.start_accom'.
company.Route.start_accom: (fields.E304) Reverse accessor for 'Route.start_accom' clashes with reverse accessor for 'Route.end_accom'.
        HINT: Add or change a related_name argument to the definition for 'Route.start_accom' or 'Route.end_accom'.
company.Route.start_accom: (fields.E305) Reverse query name for 'Route.start_accom' clashes with reverse query name for 'Route.end_accom'.
        HINT: Add or change a related_name argument to the definition for 'Route.start_accom' or 'Route.end_accom'.

System check identified 4 issues (0 silenced).

【问题讨论】:

    标签: sql django django-models django-1.10 python-3.6


    【解决方案1】:

    正如它所提到的,问题是由于反向关系。你需要add the related_name attribute

    class Route(models.Model):                                                                                                  
        start_accom = models.OneToOneField(                                                                                     
            Accommodation,                                                                                                      
            on_delete=models.CASCADE,                                                                                           
            primary_key=True, 
            related_name="accommodation_start"                                                                                                  
        )                                                                                                                       
        end_accom = models.OneToOneField(                                                                                                                                                                             
            Accommodation,                                                                                                      
            on_delete=models.CASCADE,                                                                                           
            related_name="accommodation_end"                                                                                                  
        )                                                                                                                       
        mode_of_travel = models.CharField(max_length=50)                                                                        
        description = models.TextField()  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 2021-08-15
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多