【问题标题】:Where to write predefined queries in django?在 django 中哪里可以编写预定义查询?
【发布时间】:2018-04-15 05:46:54
【问题描述】:

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

由于我之前做过 SQL,所以我选择编写前端开发人员应该用来构建此页面的预定义查询(结果集分页、简单查找等)。

刚学了Django QuerySet,准备用了,但是不知道写在哪个文件/类上。

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

【问题讨论】:

  • 嗯,像 django 这样的框架的想法是您不需要编写 sql,而是使用 QuerySet API 代替。您主要在视图中编写查询集,以处理要显示的数据。如果你愿意,我可以用一个例子写一个答案。

标签: sql django django-models


【解决方案1】:

如果您有某个模型 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

【讨论】:

  • 那么在 QuerySet 中写什么呢?
  • 我一头雾水,你想用SQL还是Django的ORM?
【解决方案2】:

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

tutorial is strong on this,因此对于放置东西的位置可能比文档本身更好。

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

如果您对遵循胖模型方法并将它们放在那里特别感兴趣,那么您可能会对Manager 对象感兴趣,它们是您通过的what define querysets,例如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})

edit:第二个例子已经很老了,最好将查询重构为: future_events=Event.objects.filter(date__gt=event.date).select_related('comments')

编辑编辑:值得指出的是,QuerySet 不是一种语言,就您使用它的方式而言。它是位于数据库顶部的对象关系映射器的 django API,与 SQLAlchemy 的方式相同 - 事实上,您可以换出或使用 SQLAlchemy 而不是使用 Django ORM if you really wanted。大多数情况下,您会听到人们谈论 Django ORM。 :)

【讨论】:

  • 谢谢!你对编写原始 SQL 和 ORM 有偏好吗?还是取决于项目?
  • 根据我的经验,几乎完全是 ORM。我主要使用原始 SQL 连接到没有由 Django 模型控制的表的外部数据库。我只能想到一两个案例,我不得不针对我自己的 Django 模型编写原始 SQL,这些都是非常深奥的、特定于案例的实例。
【解决方案3】:

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 %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2019-12-14
    • 2013-08-09
    • 2022-11-03
    相关资源
    最近更新 更多