【问题标题】:Django: Two ManyToManyField to the same modelDjango:两个ManyToManyField到同一个模型
【发布时间】:2013-08-25 03:38:26
【问题描述】:

这是我的代码:

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,现在如果我有一个名为 'user' 的 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() 和 user.favourite_questions.all() 来获取用户提出和收藏的问题。但我不确定这是否属实。所以我想知道有没有什么好的方法可以解决这个问题。

【问题讨论】:

    标签: django


    【解决方案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)
    

    【讨论】:

    • 感谢您的回复,用户不是用户,用户是settings.AUTH_USER_MODEL的一个实例,问题模型对settings.AUTH_USER_MODEL有一个ForeignKey和一个ManyToManyField,所以如果我使用user.question_set.all (),django 不知道 QuerySet 应该包含哪个字段(字段作者或 favourite_users)。我想知道设置'related_name'是否是解决这个问题的好方法
    • question_set 中的名称question django 知道您在寻找哪个字段。使用related_name 为“反向”关系定制经理。您不应使用User(来自django.contrib.auth. models),而应在查询中使用get_user_model() 方法,因为您使用的是自定义身份验证模型。
    • 你误会了,如果 Question 只有一个 ManyToManyField 到 settings.AUTH_USER_MODEL,那么你使用 'question_set',好的,django 知道 QuerySet 应该包含哪个字段,但是如果 Question 有两个 ManyToManyField(ForeignKey is在这种情况下相同)到 settings.AUTH_MODEL_FIELD ,那么你使用'question_set',django如何确定QuerySet应该包含哪个字段?
    • question_set 仅适用于与Question 具有反向关系的模型,不适用于Question 对象的实例。
    • 我应该提高我的英语,我找到了解决办法,只要设置related_name,无论如何谢谢
    【解决方案2】:

    要获取某个用户提出的所有问题,请使用Question.objects.filter(author=user)。同样,要获取某个用户收藏的所有问题,请使用Question.objects.filter(favourite_users=user)

    documentation 包含一些非常有用的跨多对多关系查找示例。

    【讨论】:

      猜你喜欢
      • 2014-08-01
      • 2021-06-18
      • 2019-06-10
      • 2018-10-16
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      相关资源
      最近更新 更多