2013-01-16 107 views
0
from django.db import models 
from django.contrib.auth.models import User 

class WorkDailyRecord(models.Model): 
    user = models.ForeignKey(User) 
    date = models.DateTimeField(auto_now=True) 
    contents = models.TextField() 
    check_user = models.ManyToManyField(User) 
    target_user = models.ManyToManyField(User) 

    ONGOING_OR_END =(
      ('ing', '진행중'), 
      ('end', '완료'), 
     ) 


    ongoing_or_end = models.CharField(
      max_length=3, 
      choices=ONGOING_OR_END, 
      default='ing', 
     ) 

我寫的代碼,然後我給錯誤...Django的models.py誤差(約ManyToManyField)

於是我在網上搜索,我發現,我必須使用「related_name」屬性。

但我不知道爲什麼我必須使用attr?

爲什麼?

回答

3

通過將M2M設置爲User模型,User實例將在其上設置自動workdailyrecord_set屬性集。由於你需要2個訪問器,Django抱怨,因爲它不能設置workdailyrecord_set兩次。

如果他們允許的話,確實會很混亂,因爲誰知道user.workdailyrecord_set會在那種情況下返回。

您需要給它一個related_name來區分指向User的兩個關係。

target_user = models.ManyToManyField(User, related_name='workdailyrecord_target') 
check_user = models.ManyToManyField(User, related_name='workdailyrecord_check') 

這樣,User情況下,將有一個workdailyrecord_target反向管理器,它只會查詢WorkDailyRecordtarget_user關係有關User對象。

例如

User.objects.latest('id').workdailyrecord_target.all() 
# all WorkDailyRecords where user is referenced by 'target_user' 

User.objects.latest('id').workdailyrecord_check.all() 
# all WorkDailyRecords where user is referenced by 'target_check' 

不幸的是,你甚至可以使用Django的記錄related_name='+'功能,當談到M2Ms未禁用此功能。不要問我爲什麼:)

+0

哇,謝謝!玩的很開心。新年快樂〜 – chobo