2016-11-27 117 views
0

Django的模型的一個方面,我根本沒有得到我的頭是相關領域,並得到他們的使用正確。我認爲這反映了對SQL和數據庫的普遍理解 - 因此我懷疑這對於許多django用戶來說是個問題。Django相關領域的正確用法

在我目前的代碼中,我構建了一個旅遊應用程序,因此我將住宿作爲模型。然後我有Route。一天的路線最終成爲一堆關係領域,但讓我感到困惑的是我需要一個起點住宿和一個最終住宿 - 這兩個不同的關係。

對我來說,在邏輯上,我應該可以有一個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). 

回答

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()