0

我的models.py中有这个:

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

其中 subject 和 slug 相应地是:

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)

它是这样工作的。没有必要检查是否有主题,因为总会有。

4

1 回答 1

1

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

例如,如果您的主题模型有一个日期字段,您可以返回主题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以了解最适合您的方法。

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

def get_absolute_url(self):
    try:
        return "/subject..."
    except:
        return "/another-url/"    
于 2013-03-11T12:16:20.667 回答