2013-08-25 80 views
0

這是我的代碼:Django的:兩個ManyToManyField到相同型號

class Question(models.Model): 
    title = models.CharField(max_length=255, verbose_name='title', unique=True) 
    content = models.TextField(verbose_name='content') 
    author = models.ForeignKey(settings.AUTH_USER_MODEL) 
    favourite_users = models.ManyToManyField(settings.AUTH_USER_MODEL, 
              blank=True, null=True) 

這種模式有一個ForeignKey和ManyToManyField到settings.AUTH_USER_MODEL,現在如果我有一個名爲「用戶」一settings.AUTH_USER_MODEL例如,我怎樣才能得到這個用戶寫的問題,並提出這個用戶喜歡的問題?我曾嘗試 'user.question_set.all()',但它不工作,也許我應該設置related_name,像這樣:

author = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='questions') 
favourite_users = models.ManyToManyField(settings.AUTH_USER_MODEL, 
             related_name='favourite_questions', 
             blank=True, null=True) 

,然後使用:user.questions.all()和用戶。 favourite_questions.all()獲得用戶提出的問題。但我不確定它是否屬實。所以我想知道是否有任何好的方法來解決這個問題。

回答

0

要得到某個用戶提出的所有問題,請使用Question.objects.filter(author=user)。同樣,要獲得某位用戶收藏的所有問題,請使用Question.objects.filter(favourite_users=user)

documentation包含一些非常有用的跨多對多關係的查找示例。

1

我已經試過'user.question_set.all()',但由於您使用的是自定義的身份驗證模式不起作用

,你應該使用get_user_model()獲取該認證框架使用模式:

from django.contrib.auth import get_user_model 

user_model = get_user_model() 

要爲特定用戶獲取的問題:

user_model = get_user_model() 
user = user_model.objects.get(pk=1) # Now this is not the "normal" User 

user_questions = Question.objects.filter(author=user) 
user_favorites = Question.objects.filter(favorite_users=user) 
+0

感謝您的回覆,用戶不是用戶,用戶是settings.AUTH_USER_MODEL的一個實例,Question模型具有ForeignKey和ManyToManyField來設置.AUTH_USER_MODEL,所以如果我使用user.question_set.all(),則django doesn' t知道QuerySet應該包含哪個字段(field author或favourite_users)。我想知道如果設置'related_name'是解決此問題的好方法 – YuYang

+0

從'question_set'中的'question'名稱,django知道您正在查找哪個字段。使用[related_name](https://docs.djangoproject.com/en/1.5/topics/db/queries/#backwards-related-objects)爲「反向」關係自定義管理器。您不應該使用'User'(來自'django.contrib.auth。models'),而應該在查詢中使用'get_user_model()'方法,因爲您使用的是自定義auth模型。 –

+0

您誤解我了,如果問題只有一個ManyToManyField設置爲settings.AUTH_USER_MODEL,那麼您使用'question_set',好吧,django知道QuerySet應該包含哪個字段,但是如果Question有兩個ManyToManyField(ForeignKey在這種情況下是相同的) .AUTH_MODEL_FIELD,然後使用'question_set',django如何確定QuerySet應包含哪個字段? – YuYang