查询多对多关系不会返回任何内容

时间:2019-08-28 07:49:00

标签: django

我正在查询集:

def get_context_data(self, name, **kwargs):
    context = super(ListDetailsOfTestSuite, self).get_context_data(**kwargs)
    context['test_suite'] = TestSuite.objects.filter(name=name)
    temp = TestSuite.objects.get(name=name)
    context['test_cases'] = temp.test_cases.all()
    return context

型号:

class TestCase(models.Model):

    name = models.CharField(max_length=200)
    documentation = models.CharField(max_length=2048, blank=True)
    steps = models.CharField(max_length=2048, blank=True)
    tags = models.CharField(max_length=200, blank=True)
    setup = models.CharField(max_length=2048, blank=True)
    teardown = models.CharField(max_length=2048, blank=True)
    template = models.CharField(max_length=200, blank=True)
    timeout = models.IntegerField(default=10)

    def __str__(self):
        return self.name


class TestSuite(models.Model):

    name = models.CharField(max_length=200)
    documentation = models.CharField(max_length=2048, blank=True)
    setup = models.CharField(max_length=2048, blank=True)
    teardown = models.CharField(max_length=2048, blank=True)
    force_tags = models.CharField(max_length=200, blank=True)
    timeout = models.IntegerField(default=10)
    # user can have multiple test suites
    user = models.ForeignKey(User, default=1, on_delete=models.CASCADE)
    # Suite can contain a list of test cases but also a number of other test suites
    test_cases = models.ManyToManyField(TestCase, through='SuiteCaseThroughModel')

    def __str__(self):
        return self.name

    class Meta:
        ordering = ('name',)


class SuiteCaseThroughModel(OrderedModel):

    test_case = models.ForeignKey(TestCase, on_delete=models.CASCADE)
    test_suite = models.ForeignKey(TestSuite, on_delete=models.CASCADE)

    order_with_respect_to = 'test_suite'

但是,我什么也没得到,并且我确信问题出在过滤条件下,因为当我运行context['test_cases'] = TestCase.objects.all()时,我得到了期望的结果。这个想法是从一个特定的测试套件中检索所有测试用例,因此我进行了一些研究:

temp = TestSuite.objects.get(name=name)
context['test_cases'] = temp.test_cases.all()

html:

  <div class="row">
  <div class="col-md-6">
    {% for field in test_suite %}
    {{ field.name }}
      <ul>
          <li><label>Documentation:</label>  {{ field.documentation }}</li>
          <li><label>Setup:</label>  {{ field.setup }}</li>
          <li><label>Teardown:</label>  {{ field.teardown }}</li>
          <li><label>Force Tags:</label>  {{ field.force_tags }}</li>
          <li><label>Timeout:</label>  {{ field.timeout }}</li>
     </ul>
</div>
{% endfor %}
<div class="col-md-6">
    {% for field in test_cases %}
    {{ field.name }}
    <ul>
        <li><label>Documentation:</label>  {{ field.documentation }}</li>
        <li><label>Setup:</label>  {{ field.setup }}</li>
        <li><label>Teardown:</label>  {{ field.teardown }}</li>
        <li><label>Tags:</label>  {{ field.tags }}</li>
        <li><label>Timeout:</label>  {{ field.timeout }}</li>
   </ul>
   {% endfor %}
</div>

更新

def get_context_data(self, **kwargs):
    context = super(ListDetailsOfTestSuite, self).get_context_data(**kwargs)
    context['test_suite'] = TestSuite.objects.filter(name=kwargs['name']).prefetch_related('test_cases')
    temp = TestSuite.objects.get(name=kwargs['name'])
    context['test_cases'] = temp.test_cases.all()
    return context

我在这里进行两个类似的查询,因为我需要在一页上呈现有关测试套件及其相关测试用例的信息。

尝试:

context['test_cases'] = TestCase.objects.filter(testsuite__name=kwargs['name'])

还有

context['test_cases'] = TestCase.objects.filter(suitecasethroughmodel__test_suite__name=kwargs['name'])

Django还支持从查询的另一端进行查找(或反向查找)。不过没有帮助,什么也没返回。 我目前有1个与测试套件相关的测试用例,应该返回。

1 个答案:

答案 0 :(得分:0)

如果您通过URL上的查询字符串通过了测试的Application.Run "'" & xlWb.Name & "'!Apps.Refresh_UserForm" ,则应该执行以下操作:

name

然后从您的from django.db.models import Prefetch def get_context_data(self, name, **kwargs): context = super(ListDetailsOfTestSuite, self).get_context_data(**kwargs) context['test_suite'] = TestSuite.objects.filter(name=kwargs['name']).prefetch_related( Prefetch('test_cases', queryset=TestSuite.objects.all()) ) return context 中访问test_suite,这样就可以防止运行更多查询。

您可以通过以下方式访问test_cases

test_cases