我有与此问题中提出的相同的难题,但适用于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),但这对数据库来说是一个额外的打击.
那么,如何将基础模型类转换为其代理类?
我想将查询集条件保存到数据库以供重用.
所以,如果我有一个像这样的查询集:
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) 我需要将冷线索与我们客户的数据库相匹配.
这些销售线索来自第三方提供商(数千条记录),销售人员要求我们(用他们的话说)"过滤掉我们的客户",这样他们就不会试图将我们的服务卖给老牌客户.
显然,线索中存在拼写错误.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) 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) 我在从我的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会有不同的行为,是否有可以在我的代码中应用的简单修复?
我怎样才能在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(),索引和其他东西.还有另外一种方法吗?