Django模板访问多个到多个数据NOT IN A LOOP

时间:2014-02-18 20:39:05

标签: django templates

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之间多对多关系中的所有行。

2 个答案:

答案 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))。不支持负面索引。

实际上,我不知道你需要什么标准:

  1. 如果您需要特定条件,请预处理查询= infoInstance.fish.filter(criteriaHere)
  2. 否则,预处理查询= infoInstance.fish.all()
  3. 之后,您可以:

    1. 如果您希望只有一个具有该条件的对象存在,并且0或2+个对象是错误,请执行object=query.get()而不是filter()
    2. 如果您需要特定位置的特定对象,请保留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或其他东西(不是那么大),否则你不能在模板中做到这一点