【问题标题】:How to get object using filter on ManyToManyField如何在 ManyToManyField 上使用过滤器获取对象
【发布时间】:2017-05-22 03:30:03
【问题描述】:

为什么 target_dialogue 总是 None?

型号:

class Dialogue(models.Model):
    name = models.CharField(max_length=30, blank=True)
    is_conference = models.BooleanField(default=False)

    participants = models.ManyToManyField(
        Person,
        related_name='dialogues',
    )

    def __str__(self):
        return self.name or str(self.pk)

鉴于我想获得合适的对话,其中包含参与者字段 2 对象 - 用户和同伴。如果此对话不存在,我将创建它:

        target_dialogue = None
        try:
            target_dialogue = Dialogue.objects.get(is_conference=False,participants__in=[user, companion])
        except ObjectDoesNotExist:
            target_dialogue = Dialogue()
            target_dialogue.save()
            target_dialogue.participants.add(user)
            target_dialogue.participants.add(companion)
        finally:
            return render(request, 'dialogues/dialogue.html', {
                'dialogue': target_dialogue,
            })

但 target_dialogue 始终为 None。这是什么原因?我应该只解决从 db 获取对话以过滤参数错误的问题,但现在我对此表示怀疑。也许还有别的?

【问题讨论】:

    标签: django python-3.x filter models manytomanyfield


    【解决方案1】:

    request.user 不是您在对话中与之有关系的Person 模型的对象。

    你必须先获取 person 对象:

    user = Person.objecs.get(user=request.user). # According to your person model
    

    随播随同,然后查询:

    target_dialogues = Dialogue.objects.filter(is_conference=False,participants__in=[user,companion]
    

    【讨论】:

    • 是的,谢谢,这是真的。但无论如何问题都没有解决。我仍然遇到 target_dialogue 为 None 的问题。因此,这不仅仅是因为它。我将在问题中添加更多代码以澄清它。
    • 此外,不仅仅是参与者__in=[用户,同伴],而是参与者__in=[用户和同伴]
    猜你喜欢
    • 2021-04-19
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多