小编def*_*fuz的帖子

在django中分离业务逻辑和数据访问

我正在Django中编写一个项目,我发现80%的代码都在文件中models.py.这段代码令人困惑,经过一段时间后,我不再明白究竟发生了什么.

这是困扰我的:

  1. 我发现我的模型级别(它应该只负责处理数据库中的数据)也发送电子邮件,在API上运行到其他服务等等,这让我觉得很难看.
  2. 此外,我发现在业务逻辑中放置业务逻辑是不可接受的,因为这样很难控制.例如,在我的应用程序中,至少有三种创建新实例的方法User,但从技术上讲,它应该统一创建它们.
  3. 我并不总是注意到我的模型的方法和属性何时变得不确定,何时会产生副作用.

这是一个简单的例子.起初,User模型是这样的:

class User(db.Models):

    def get_present_name(self):
        return self.name or 'Anonymous'

    def activate(self):
        self.status = 'activated'
        self.save()
Run Code Online (Sandbox Code Playgroud)

随着时间的推移,它变成了这样:

class User(db.Models):

    def get_present_name(self): 
        # property became non-deterministic in terms of database
        # data is taken from another service by api
        return remote_api.request_user_name(self.uid) or 'Anonymous' 

    def activate(self):
        # method now has a side effect (send message to user)
        self.status = 'activated'
        self.save()
        send_mail('Your account is activated!', '…', [self.email])
Run Code Online (Sandbox Code Playgroud)

我想要的是在我的代码中分离实体:

  1. 我的数据库,数据库级别的实体:什么包含我的应用程序?
  2. 我的应用程序的实体,业务逻辑级别:什么可以使我的应用程序?

实现可以在Django中应用的这种方法有哪些好的做法?

python django model-view-controller business-logic-layer data-access-layer

441
推荐指数
5
解决办法
9万
查看次数

立即调用setTimeout

经常在JavaScript库中看到这样的代码:

setTimeout(function() {
    ...
}, 0);
Run Code Online (Sandbox Code Playgroud)

我想知道为什么要使用这样的包装代码.

javascript settimeout

39
推荐指数
4
解决办法
1万
查看次数

Python:实例没有属性

我在python中的类中列表有问题.这是我的代码:

class Residues:
    def setdata(self, name):
        self.name = name
        self.atoms = list()

a = atom
C = Residues()
C.atoms.append(a)
Run Code Online (Sandbox Code Playgroud)

像这样的东西.我收到一个错误说:

AttributeError: Residues instance has no attribute 'atoms'
Run Code Online (Sandbox Code Playgroud)

python class attributeerror

18
推荐指数
1
解决办法
10万
查看次数

如何确定哪些更有效:DISTINCT还是EXES EXISTS?

例如,我有3个表:user,grouppermission,和他们之间有两个many2many关系:user_groupsgroup_permissions.

我需要选择给定用户的所有权限,不重复.每次遇到类似问题时,我都无法确定哪个版本的查询更好:

SELECT permisson_id FROM group_permission WHERE EXISTS(
    SELECT 1 FROM user_groups 
        WHERE user_groups.user_id = 42 
          AND user_groups.group_id = group_permission.group_id
)

SELECT DISTINCT permisson_id FROM group_permission
    INNER JOIN user_groups ON user_groups.user_id = 42 
           AND user_groups.group_id = group_permission.group_id 
Run Code Online (Sandbox Code Playgroud)

我有足够的经验可以根据解释得出结论.第一个查询有子查询,但我的经验表明第一个查询更快.也许是因为结果中有大量过滤后的权限.

在这个情况下,你会怎么做?为什么?谢谢!

mysql performance inner-join distinct explain

11
推荐指数
1
解决办法
6369
查看次数

在jinja2中使用包含文件中的块作为父项

我不确定我想做什么是可能的:我正在尝试在父模板中获取一个块,以便由父模板的子模板中包含的文件填充.

解释这个的最好方法是测试用例:

文件t1.djhtml:

<root>
    <block t3_container>
        {% block t3 %}This should be 'CONTENT'{% endblock %}
    </block t3_container>

    <block t2_container>
    {% block t2 %}{% endblock %}
    </block t2_container>
</root>
Run Code Online (Sandbox Code Playgroud)

文件t2.djhtml:

{% extends 't1.djhtml' %}

{% block t2 %}
        <block t2>
            {%- include 't3.djhtml' with context %}
        </block t2>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

文件t3.djhtml:

{% block t3 %}
        <block t3>
            CONTENT
        </block t3>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

文件test.py:

from jinja2 import Environment, FileSystemLoader
env  = Environment(loader=FileSystemLoader('')) …
Run Code Online (Sandbox Code Playgroud)

python jinja2

7
推荐指数
1
解决办法
4224
查看次数

使用html或javascript在CDE仪表板中打印变量

我有一个带有弹出切片器的仪表板,但是一旦我关闭弹出窗口就无法分辨选择了哪些变量,所以我想在图表上方显示一行,包含所有参数的路径类型我在切片机盒中选择.

我试图引用他们在一个HTML布局位置,如: ${size},${type},${line}${service},但它显示为书面文本.没有解析变量.

我还创建了一个自由形式组件来使用Javascript,但我看不到任何数据,我无法弄清楚要使用的功能.

parameters dashboard pentaho

7
推荐指数
1
解决办法
1万
查看次数

具有较少查询的父对象及其子对象列表

我有一个Django视图,我正在尝试优化.它显示页面上的父对象列表及其子对象.子模型将外键返回到父项,因此select_related似乎不适用.

class Parent(models.Model):
    name = models.CharField(max_length=31)

class Child(models.Model):
    name = models.CharField(max_length=31)
    parent = models.ForeignKey(Parent)
Run Code Online (Sandbox Code Playgroud)

一个简单的实现使用n + 1个查询,其中n是父对象的数量,即.一个查询用于获取父列表,然后一个查询用于获取每个父项的子项.

我写了一个视图,在两个查询中完成工作 - 一个用于获取父对象,另一个用于获取相关的子对象,然后是一些Python(我太尴尬了,无法在此处发布)将它们全部重新组合在一起.

一旦我发现自己导入标准库的collections模块,我意识到我可能做错了.可能有一个更简单的方法,但我缺乏Django经验来找到它.任何指针将非常感谢!

python django query-optimization django-queryset

5
推荐指数
1
解决办法
1925
查看次数

删除所有blobstore数据的最简单方法是什么?

从blobstore中删除所有blob的最佳方法是什么?我正在使用Python.

我有很多blob,我想删除它们.我目前正在做以下事情:

class deleteBlobs(webapp.RequestHandler): 
    def get(self): 
        all = blobstore.BlobInfo.all(); 
        more = (all.count()>0) 
        blobstore.delete(all); 
        if more: 
            taskqueue.add(url='/deleteBlobs',method='GET'); 
Run Code Online (Sandbox Code Playgroud)

这似乎是使用大量的CPU和(据我所知)没有任何用处.

python google-app-engine task-queue blobstore

4
推荐指数
1
解决办法
2146
查看次数

在django帖子中"阅读更多"

我正在django/webfaction上创建一个博客.目前我的主页显示所有帖子的所有内容.我想调整它以显示每个帖子中只有几行,每个帖子以"阅读更多"链接结尾.怎么做到这一点?我是django和python的新手.请帮助我.

home.html中的代码:

{% block content %}

  {% for post in object_list %}
  <h2>{{ post.title }} </h2>

  <div class = "post_meta">
      on {{ post.created}}
  </div>

  <div class = "post_body">
      {{ post.body|safe|linebreaks}}
  </div>

  {% endfor %}

{% endblock %}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

html python django django-templates

4
推荐指数
1
解决办法
4483
查看次数

如何在类声明中调用函数?

有这个代码:

>>> class Foo:
...     zope.interface.implements(IFoo)
...
...     def __init__(self, x=None):
...         self.x = x
...
...     def bar(self, q, r=None):
...         return q, r, self.x
...
...     def __repr__(self):
...         return "Foo(%s)" % self.x
Run Code Online (Sandbox Code Playgroud)

Obviously, the call of zope.interface.implements in some way alters the properties and behavior of the class Foo.

How does this happen? How do I use this approach in my code?

Example code is the part of zope.interface module.

python zope metaprogramming zope.interface

3
推荐指数
1
解决办法
644
查看次数

如何说服借用检查器允许我缓存值?

借款检查员打败了我:

use std::collections::HashMap;

struct Cache {
    cache: Vec<HashMap<String, String>>,
}

impl Cache {
    fn get(&mut self, index: usize, key: String) -> String {
        let mut cache = &mut self.cache[index];
        match cache.get(&key) {
            Some(r) => {
                return r.clone();
            }
            None => {
                let r = "foo".to_string(); // something smart here
                cache.insert(key, r.clone());
                return r;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到了什么:

error[E0502]: cannot borrow `*cache` as mutable because it is also borrowed as immutable
  --> src/main.rs:16:17
   |
10 |         match cache.get(&key) {
   | …
Run Code Online (Sandbox Code Playgroud)

rust borrow-checker

3
推荐指数
1
解决办法
364
查看次数