我正在尝试查询一个表,其中我有许多具有相同名称的记录。在我的例子中,我正在使用汽车的制造,不幸的是我已经排除了使用外键。很长的故事。无论如何,我已经能够确定我可以使用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
提前感谢您的意见和建议。
答案 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')
一种简单的方法可以使这更加充满活力"将在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()
使用icontains
或iexact
查询,甚至使用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_1
,vehicle_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
元素。