小编cet*_*eek的帖子

如何将request.user转换为代理auth.User类?

我有与此问题中提出的相同的难题,但适用于Django的auth.User.

我有这个代理模型:

class OrderedUser(User):
    def __unicode__(self):
        return self.get_full_name()

    class Meta: 
        proxy=True
        ordering=["first_name", "last_name"]
Run Code Online (Sandbox Code Playgroud)

我的一些其他模型使用的是字段类型OrderedUser而不是django.contrib.auth.models.User字段类型.

在我的视图中,我然后使用request.user填充字段和 - 正如预期 - 得到一个错误:

'Cannot assign "<User...>": <field> must be a "OrderedUser" instance'
Run Code Online (Sandbox Code Playgroud)

我可以做OrderedUser.objects.get(request.user.id),但这对数据库来说是一个额外的打击.

那么,如何将基础模型类转换为其代理类?

django django-models

17
推荐指数
2
解决办法
2725
查看次数

如何获取和/或保存查询集条件到数据库?

我想将查询集条件保存到数据库以供重用.

所以,如果我有一个像这样的查询集:

Client.objects.filter(state='AL') 

# I'm simplifying the problem for readability. In reality I could have 
# a very complex queryset, with multiple filters, excludes and even Q() objects.
Run Code Online (Sandbox Code Playgroud)

我想保存到DB而不是查询集的结果(即具有匹配'AL'的状态字段的各个客户端记录); 但是查询集本身(即用于过滤客户端模型的标准).

最终目标是拥有一个"已保存的过滤器",可以从数据库中读取并由多个django应用程序使用.

起初我以为我可以序列化查询集并保存它.但序列化查询集实际上执行查询 - 然后我在序列化时最终得到了阿拉巴马州的静态客户端列表.我希望列表是动态的(即每次我从DB读取它应该执行的查询集并检索Alabama中最新的客户端列表).


编辑:或者,是否可以获取应用于查询集的过滤器列表?

就像是:

qs = Client.objects.filter(state='AL')
filters = qs.getFilters()
print filters

{ 'state': 'AL' }
Run Code Online (Sandbox Code Playgroud)

django django-queryset

15
推荐指数
1
解决办法
3769
查看次数

有没有办法根据字符串相似性过滤django查询集(la python difflib)?

我需要将冷线索与我们客户的数据库相匹配.

这些销售线索来自第三方提供商(数千条记录),销售人员要求我们(用他们的话说)"过滤掉我们的客户",这样他们就不会试图将我们的服务卖给老牌客户.

显然,线索中存在拼写错误.Charles成为Charlie,Joseph成为Joe等等.所以我不能真正做一个过滤器,比较lead_first_name和client_first_name等.

我需要使用某种字符串相似性机制.

现在我正在使用可爱的difflib将引导的名字和姓氏与生成的列表进行比较Client.objects.all().它可以工作,但由于客户端的数量,它往往很慢.

我知道大多数sql数据库都有soundex和差异函数.在下面的更新中查看我对它的测试 - 它不像difflib那样有用.

还有其他解决方案吗?有更好的解决方案吗?

编辑:

至少在我的数据库中,Soundex的表现不如difflib.

这是一个简单的测试 - 在包含"Joseph Lopes"的表格中查找"Joe Lopes":

with temp (first_name, last_name) as (
select 'Joseph', 'Lopes'
union
select 'Joe', 'Satriani'
union
select 'CZ', 'Lopes'
union
select 'Blah', 'Lopes'
union
select 'Antonio', 'Lopes'
union
select 'Carlos', 'Lopes'
)
select first_name, last_name
  from temp
 where difference(first_name+' '+last_name, 'Joe Lopes') >= 3
 order by difference(first_name+' '+last_name, 'Joe Lopes')
Run Code Online (Sandbox Code Playgroud)

以上返回"Joe Satriani"作为唯一的比赛.即使将相似度阈值降低到2也不会将"Joseph Lopes"作为潜在匹配.

但是difflib做得更好:

difflib.get_close_matches('Joe Lopes', ['Joseph Lopes', 'Joe Satriani', …
Run Code Online (Sandbox Code Playgroud)

django similarity django-queryset

8
推荐指数
1
解决办法
2772
查看次数

根据参数类型在A类上调用方法

class Class1(object):
    ...

class Class2(object):
    ...

class Class3(object):
    ...

class A(object):
    def _methA(parm1, parm2)
        ...

    def _methB(parm1, parm2)
        ...

    def _methC(parm1, parm2)
        ...

    def manager(parm1, method, params)
        ...
        if parm1.__class__.__name__==Class1.__name__:
            response = _methA(parm1, params)
        elif parm1.__class__.__name__==Class2.__name__:
            response = _methB(parm1, params)
        elif io_source.__class__.__name__==Class3.__name__:
            response = _methC(parm1, params)
        else:
            raise Exception, "Unsupported parm1"
        ...
Run Code Online (Sandbox Code Playgroud)

我不喜欢看到的if/elif块的方式manager()并重构它:

def manager(parm1, method, params)
    ...
    try:
        response = {
                Class1.__name__: lambda parm1, parms: _methA(parm1, parms),
                Class2.__name__: lambda parm1, parms: _methB(parm1, parms),
                Class3.__name__: lambda …
Run Code Online (Sandbox Code Playgroud)

python oop

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

Django EmailMultiAlternatives和HTML电子邮件在Win2003上的Outlook 2003中显示

我在从我的django应用程序发送电子邮件时使用django.core.mail.EmailMultiAlternatives,以确保在电子邮件客户端不支持HTML时邮件降级为文本.

这是我的send_email方法:

def send_email(self, from_address, to_list, subject, msg_text, msg_html):
        subject=subject.replace('\r','').replace('\n',' ')
        self.msg = EmailMultiAlternatives(subject, msg_text, from_address, to_list)
        self.msg.attach_alternative(msg_html, "text/html")
        self.msg.content_subtype = "html"
        self.msg.send()
Run Code Online (Sandbox Code Playgroud)

它适用于Gmail,Hotmail和许多其他电子邮件客户端 - 显示HTML内容没有问题.但它不会在Win2003上运行的Outlook 2003中显示HTML内容 - 只是文本版本.

如果我强行将HTML放入EmailMultiAlternatives调用中,即使用msg _html instead of msg_text,如下所示:

self.msg = EmailMultiAlternatives(subject, msg_html, from_address, to_list)
Run Code Online (Sandbox Code Playgroud)

然后它在所有客户端都能正常工作; 但这意味着对于不支持HTML的客户端或(更可能)已禁用HTML的客户端没有文本回退.

我认为值得一提的是,电子邮件是在Mac OS X上运行的django应用程序上生成的(以防万一它与操作系统之间的行终止符差异有关).

我看到使用其他语言的人与outlook有类似的问题......

我想知道是否有人知道为什么outlook会有不同的行为,是否有可以在我的代码中应用的简单修复?

html python email django

2
推荐指数
1
解决办法
5068
查看次数

Django具体的sql查询

我怎样才能在django中执行这样的查询:

SELECT * FROM keywords_keyword WHERE id not in (SELECT keyword_id FROM sites_pagekeyword)
Run Code Online (Sandbox Code Playgroud)

在最新的SVN版本中,我们可以使用:

keywords = Keyword.objects.raw('SELECT * FROM keywords_keyword WHERE id not in (SELECT keyword_id FROM sites_pagekeyword)')
Run Code Online (Sandbox Code Playgroud)

但RawQuerySet不支持filter(),count(),索引和其他东西.还有另外一种方法吗?

python sql django django-models

0
推荐指数
1
解决办法
232
查看次数

标签 统计

django ×5

python ×3

django-models ×2

django-queryset ×2

email ×1

html ×1

oop ×1

similarity ×1

sql ×1