models.py
class Fish(models.Model):
sci_name = models.CharField(max_length=50)
com_name = models.CharField(max_length=50)
...
class Info(models.Model):
fish = models.ManyToManyField(Fish)
short_description = models.TextField(max_length=200)
...
views.py
def available(request):
in_stock = Info.objects.order_by('id')
...
context = RequestContext(request, {
'in_stock': in_stock,
...
available.html
{% for fishnumber in in_stock %}
{{ fishnumber.short_description }} //this line works
{{ fishnumber.fish.sci_name }} //this line doesn't work
{% for fish in fishnumber.fish.all %} //this loop works
{{ fish.sci_name }}
{% endfor %}
我想通过与Fish有多对多的关系来访问sci_name字段,而没有第二个for循环。 我搜索了文档和谷歌,但我能找到的所有答案都显示了如何通过fishnumber.fish.all循环访问该字段。 这工作正常,但我想在Fish表中指定确切的行并从sci_name列中选择元素,而不循环遍历Info和Fish之间多对多关系中的所有行。
答案 0 :(得分:0)
如果您想获得单个第n个元素,请执行以下操作:
all_qs = (a specific Info instance).fish.all() #i suggest using an order criteria here
myobject = all_qs[0] #get the first object returned by the query
myval = myobject.sci_name
在这里捕获例外 - 索引可能不存在,即使是0 如果您想通过其他条件获取,请在查询中指定条件并获取所需的第X个项目(可能是第一个)。
请记住,M2M是“经理”,他们执行查询 - 它们不是数组。
再次记住:您可以在括号之间指定[anyIndex]
,甚至[any:slice]
。两者都将被视为LIMIT
偏移量,金额(使用正确的数字映射,例如[1:6]
将变为LIMIT 1, 5
(即6-1))。不支持负面索引。
实际上,我不知道你需要什么标准:
object=query.get()
而不是filter()
filter()
或all()
和索引,如下所示:object=query[positionYouWant]
答案 1 :(得分:0)
你需要有一些方法来决定你想要哪一个。我的意思是 - 说有三条鱼,你如何区分你想要的特定鱼?每个人都有自己的sci_name。要决定其中一个,你需要提供该功能。
或者,换句话说,只使用模型方法。假设你想捕捉最新的鱼,并展示它的sci_name。你会这样做的
class Info(models.Model):
...
def latest_catch(self):
return self.fish.latest().sci_name
然后在模板中:
{% for fishnumber in in_stock %}
{{ fishnumber.short_description }}
{{ fishnumber.latest_catch }}
{% endfor %}
或许你想要用逗号连接所有相关的sci_names:
class Info(models.Model):
...
def fish_names(self):
return ', '.join(self.fish.values('sci_name'))
*我不记得.values
的确切行为,也许直接加入不起作用。无论如何,你得到的照片,对吗?
如果你需要将一些参数传递给该函数(比如一个id来过滤掉鱼),除非you build your own template tag或其他东西(不是那么大),否则你不能在模板中做到这一点