从models.py中的ManyToMany字段访问一个元素,以构造get_absolute_url

时间:2013-03-11 12:06:10

标签: django url many-to-many models

我在models.py中有这个:

 def get_absolute_url(self):
         return "/subject/%s/graphs/%s/" % (self.subject, self.slug)

相应的主题和slu ::

subject = models.ManyToManyField(Subject)
slug = models.SlugField(max_length=120, unique=True)

我知道我在get_absolute_url()函数中的方法是错误的,并返回 Subject 对象的列表。

我想只访问一个元素(它与哪个元素无关)所以我可以构建图形的url,但我不知道该怎么做。我尝试了几件事,但他们没有用。

更新

得到解决方案:

def get_absolute_url(self):
         for e in self.subject.all():
             return "/subject/%s/graphs/%s/" % (e.url_id, self.slug)

它的工作原理如下。没有必要检查是否有主题,因为总会有。

1 个答案:

答案 0 :(得分:1)

您的ManyToMany字段是一个返回多个QuerySet个对象的关系,因此您需要从该查询集中选择一个对象来构建您的URL。你可以用很多方法做到这一点。

例如,如果您的主题模型有日期字段,则可以返回the latest主题:

return "/subject/%s/graphs/%s/" % (self.subject.all().latest("my_date_field"), self.slug)

或者,您可以尝试获取查询集的第一个主题:

return "/subject/%s/graphs/%s/" % (self.subject.all()[0], self.slug)

查看QuerySet API,了解哪些内容最适合您。

您还应该记住,如果没有与您的模型关联的Subject对象,您的get_absolute_url方法可能会抛出异常,因此您应该这样做:

def get_absolute_url(self):
    try:
        return "/subject..."
    except:
        return "/another-url/"