Hay,我正在使用django 1.2,我想知道如何计算原始查询集(RawQuerySet)中的行.
传统的.count()方法不起作用.
继承人我的疑问
query = "SELECT *, ((ACOS(SIN(%s * PI() / 180) * SIN(lat * PI() / 180) + COS(%s * PI() / 180) * COS(lat * PI() / 180) * COS((%s - lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance FROM app_car WHERE price BETWEEN %s AND %s HAVING distance<=%s ORDER BY distance ASC"
cars = Car.objects.raw(query, [lat, lat, lon, min_price, max_price, miles])
return HttpResponse( cars )
Run Code Online (Sandbox Code Playgroud)
它的回归
Car_Deferred_model_id_user_id object
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有两个与一对多相关的模型:
class Person(models.Model):
name = models.CharField(max_length=255);
surname = models.CharField(max_length=255);
age = models.IntegerField();
class Dog(models.Model):
name = models.CharField(max_length=255);
owner = models.ForeignKey('Person');
Run Code Online (Sandbox Code Playgroud)
我想输出一份人员名单,并在每个人的下方列出他所拥有的狗.这是我如何做到的:
在视图中:
persons = Person.objects.all()[0:100];
Run Code Online (Sandbox Code Playgroud)
在模板中:
{% for p in persons %}
{{ p.name }} has dogs:<br />
{% for d in persons.dog_set.all %}
- {{ d.name }}<br />
{% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做,Django将执行101个SQL查询,效率非常低.
我试图创建一个自定义管理器,它将获取所有人,然后所有的狗并在python中链接它们,但后来我不能使用paginator(我的另一个问题:Django:Paginator +原始SQL查询)它看起来很丑陋.
这样做有更优雅的方式吗?
UPDATE
解决方案基于@Daniel Roseman的博客条目
all_objects = Person.objects.select_related().all();
paginator = Paginator(all_objects, 100);
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = …Run Code Online (Sandbox Code Playgroud) 我有一个原始 SQL 查询,用于为 Django REST ListAPI 视图构建查询集。它大致如下(请原谅无意义的名称):
class MyView(ListAPIView):
serializer_class = MySerializer
paginate_by = 10
def get_queryset(self):
params = {
"uid": str(self.request.user.id),
"param": str(self.kwargs['param'])
}
query = 'SELECT f.id ' \
'FROM myapp_foo f, myapp_bar b ' \
'WHERE b.foo_id = f.id AND ' \
'b.param >= %(param)s AND ' \
'f.dt_tm >= NOW() AND ' \
'(SELECT COUNT(*) FROM myapp_baz z ' \
'WHERE z.user_id = %(uid)s AND ' \
'z.qux_id = f.qux_id) = 0 ' \
'ORDER BY …Run Code Online (Sandbox Code Playgroud)