查询数据库表而不使用外键Django Postgresql

时间:2017-11-01 15:02:00

标签: django python-3.x django-forms django-templates django-views

我正在尝试查询一个表,其中我有许多具有相同名称的记录。在我的例子中,我正在使用汽车的制造,不幸的是我已经排除了使用外键。很长的故事。无论如何,我已经能够确定我可以使用ModelChoiceField查询表并使用distinct命令,因为我正在使用Postgresql,如下所示:

class Vehicle(forms.Form):

    dropdown = forms.ModelChoiceField(queryset=Car.objects.none())

    def __init__(self, *args, **kwargs):
        super(Vehicle, self).__init__(*args, **kwargs)
        self.fields['dropdown'].empty_label = ''     
        qs = Car.objects.distinct('vehicle_make')  

上面的代码执行我需要的下拉列表,它将ModelChoiceField限制为汽车的vehicle_make的唯一值。

挑战是当我尝试在我的模板中使用该vehicle_make显示所有记录时。我试图做一个详细信息视图,但它只显示我的个人记录。这是有道理的,因为详细视图仅适用于该记录,但我正在试图找出如何查询表以向我显示该vehicle_make的所有记录。我也探索了ChoiceField,但似乎无法让它工作。我在模板中尝试了以下代码的几种变体,但似乎没有任何效果。

{% for vehicle_make in car.queryset %}
   {{ vehicle_make }}
{% endfor %}

我的模型如下:

Car(models.Model):
    vehicle_make = models.Charfield(max_length=264,unique=False)

    def __str__(self):
        return self.vehicle_make

提前感谢您的意见和建议。

1 个答案:

答案 0 :(得分:0)

您可以使用Car vehicle_make查询具有给定值的所有Car.objects.filter(vehicle_make = 'foo')个对象。例如,此ListView将列出所有汽车:

from django.views.generic.list import ListView
from .models import Car

class CarListView(ListView):
    context_object_name = "car_list"
    queryset = Car.objects.all()

此视图会列出所有制作'foo'的车辆:

class FooCarListView(ListView):
    context_object_name = "car_list"
    queryset = Car.objects.filter(vehicle_make = 'foo')

一种简单的方法可以使这更加充满活力&#​​34;将在URL中查找搜索查询,作为关键字参数或查询字符串。您可以使用现有表单创建这样的URL,然后在视图中解析它。例如,此视图会查找附加?search=bar的网址:

class SearchableCarListView(ListView):
    context_object_name = "car_list"
    def get_queryset(self):
        search_term = self.request.GET.get('search', None)
        if search_term is not None:
            return Car.objects.filter(vehicle_make = search_term)
        return Car.objects.all()

使用icontainsiexact查询,甚至使用Django' full text search,可以更好地满足您的使用案例。

在任何这些视图的模板中,您可以访问查询集中的所有Car个对象,如下所示:

{% for car in car_list %}
    {{car}}
{% endfor %} 

我希望我理解并解决了你的问题。我不是100%确定你现在如何使用你的表格,所以如果我忽略了那里的任何事情,请告诉我。

在我们在评论中进行讨论后,我认为您的表单过于复杂,我认为您的查找可能没有按照您的意愿进行。

我们将获得所有不同ValuesQuerySet值的vehicle_make

qs = Car.objects.values('vehicle_make').distinct()

(参见:Select DISTINCT individual columns in django?

这会返回ValuesQuerySet,如下所示:

<QuerySet [{'vehicle_make': 'vehicle_make_1'}, {'vehicle_make': 'vehicle_make_2'}...]

vehicle_make_1vehicle_make_2等是您的独特价值观。

我们可以将此查询集qs提供给我们的模板并构建一个select元素。我们还可以先将其简化为值列表,以便在模板中更容易使用:

values_list = [ c['vehicle_make'] for c in qs.all() ]

将该值传递给我们的模板并使用它来制作我们的select元素:

<select name='search'>
    {% for vehicle_make in values_list %}
    <option value = {{vehicle_make}} > {{vehicle_make}} </option>
    {% endfor %}
</select>

从这里你有几个选择。在我看来,最简单的方法是在一个使用select方法构建搜索URL的表单中使用此GET元素,就像我们之前讨论的那样。请查看此问题的第一个答案以获取更多信息:<form method="link" > or <a>? What's the difference?该问题的第一个答案中有一个代码段,可以轻松调整以创建基于GET的新搜​​索表单创建了select元素。