我在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)
它的工作原理如下。没有必要检查是否有主题,因为总会有。
答案 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/"