在django中编写预定义查询的位置?

时间:2017-11-02 16:05:46

标签: sql django django-models

我正在与一个工程师团队合作,这是我的第一个Django项目。

由于我之前已经完成了SQL,因此我选择编写前端开发人员用于构建此页面的预定义查询(结果集分页,简单查找等)。

我刚学会了Django QuerySet,我已经准备好使用了它,但我不知道要写哪个文件/类。

我应该将它们作为models.py中每个类的方法编写吗? Django文档只是简单地将它们写在shell中,而我还没有读到它说它放在哪里。

3 个答案:

答案 0 :(得分:1)

通常,Django模式是您将在views.py文件的视图中编写查询。在这里,您将获取给定URL的每个预定义查询,并返回呈现模板的响应(可能是您的前端团队将与您一起构建。)或返回JSON响应(例如通过用于SPA前端的Django Rest Framework) -结束)。

tutorial is strong on this,因此对于放置内容而言,这可能是比文档本身更好的选择。

查询可以在任何地方运行,但是django构建为通过URL模式接收请求,并返回响应。这通常在views.py中完成,每个视图通常由urls.py文件中的一行调用。

如果您对跟随胖模型方法并将它们放在那里特别感兴趣,那么您可能会对Manager对象感兴趣,这些对象是您what define querysets所通过的,例如{{ 1}}

我的示例视图(对于基于类的视图,它提供有关匹配列表的信息:

MyModel.objects.all()

但是,查询集可能是任何东西。

具有不同查询集的基于函数的视图将是:

class MatchList(generics.ListCreateAPIView):
    """
    Retrieve, update or delete a Match.
    """
    queryset = Match.objects.all()
    serializer_class = MatchSerialiser

编辑:第二个例子已经很老了,查询会更好地重构为: def event(request, event_slug): from .models import Event, Comment, Profile event = Event.objects.get(event_url=event_slug) future_events = Event.objects.filter(date__gt=event.date) comments = Comment.objects.select_related('user').filter(event=event) final_comments = [] return render(request, 'core/event.html', {"event": event, "future_events": future_events})

编辑编辑:值得指出的是,QuerySet不是一种语言,就像你使用它一样。它是位于数据库顶部的对象关系映射器的django的API,与SQLAlchemy也一样 - 实际上,您可以换出或使用SQLAlchemy而不是使用Django ORM,{{3} }。大多数情况下,你会听到人们谈论Django ORM。 :)

答案 1 :(得分:0)

如果你有一些模型SomeModel并且你想通过原始SQL查询访问它的objects,你可以这样做:SomeModel.objects.raw(raw_query)

例如:SomeModel.objects.raw('SELECT * FROM myapp_somemodel')

https://docs.djangoproject.com/en/1.11/topics/db/sql/#performing-raw-queries

答案 2 :(得分:0)

Django文件结构:

app/
    models.py
    views.py
    urls.py
    templates/
        app/
            my_template.html

在models.py

class MyModel(models.Model):
    #field definition and relations

在views.py中:

from .models import MyModel

def my_view():
     my_model = MyModel.objects.all() #here you use the querysets
     return render('my_template.html', {'my_model': my_model}) #pass the object to the template

在urls.py

from .views import my_view

url(r'^myurl/$', my_view, name='my_view'), # here you write the url that    points to your view

最后在my_template.html

# display the data using django template
{% for obj in object_list %}
    <p>{{ obj }}</p>
{% endfor %}