1

我有这个模型,它是与分类广告网站中的广告相关的对话:

class Conversation(models.Model):
    ad = models.ForeignKey(Ad, on_delete=models.CASCADE)
    starter = models.ForeignKey(User, related_name='starter', on_delete=models.SET_NULL, null=True)
    participants = models.ManyToManyField(User) 

    def get_absolute_url(self):
        return reverse('messages-conversation', kwargs={'pk':self.pk})

    def get_if_exists(self, **kwargs):
        try:
            return self.objects.get(**kwargs)
        except self.DoesNotExist:
            return None

在视图中,我想检查有关该广告的对话是否已经存在get_if_exists,但出现错误:

  1. 如果使用

    conversation = Conversation.get_if_exists(ad=ad, starter=request.user)

    我明白了

    Exception Value: name 'self' is not defined

  2. 如果使用

    conversation = Conversation().get_if_exists(ad=ad, starter=request.user)

    得到:

    Exception Value: Manager isn't accessible via Conversation instances

我做错了什么?如何做到这一点,以便我可以在视图中使用一行来获取对象(如果存在)和 None(如果不存在)?

4

1 回答 1

1

您可以制作@classmethod[Python-doc]

class Conversation(models.Model):

    # …

    @classmethod
    def get_if_exists(cls, **kwargs):
        try:
            return cls.objects.get(**kwargs)
        except self.DoesNotExist:
            return None

这里第一个参数cls是对类对象的引用。然后,您可以使用以下命令调用它:

Conversation.get_if_exists(ad=ad, starter=request.user)

这也使管理器.objects可访问,因为我们不使用Conversation 对象,而是使用会话类。此外,如果您在子类中继承对话,如果您使用SubclassOfConversation.get_if_exists(…).

于 2020-07-30T21:32:27.167 回答