我有一个Django站点,其Item对象具有布尔属性active.我想做这样的事情来将属性从False切换到True,反之亦然:
def toggle_active(item_id):
item = Item.objects.get(id=item_id)
item.active = !item.active
item.save()
Run Code Online (Sandbox Code Playgroud)
此语法在许多基于C的语言中有效,但在Python中似乎无效.还有其他方法可以在不使用的情况下执行此操作:
if item.active:
item.active = False
else:
item.active = True
item.save()
Run Code Online (Sandbox Code Playgroud)
本机python neg()方法似乎返回整数的否定,而不是布尔值的否定.
谢谢您的帮助.
我想获取当前未选择的选项的选择字段的命名值.这可能吗?
例如:models.py
FILE_STATUS_CHOICES = (
('P', 'Pending'),
('A', 'Approved'),
('R', 'Rejected'),
)
class File(models.Model):
status = models.CharField(max_length=1, default='P', choices=FILE_STATUS_CHOICES)
Run Code Online (Sandbox Code Playgroud)
views.py
f = File()
f.status = 'P'
f.save()
old_value = f.status
print f.get_status_display()
> Pending
f.status = 'A'
f.save()
new_value = f.status
print f.get_status_display()
> Approved
Run Code Online (Sandbox Code Playgroud)
如何将旧显示值从"P"变为"待定"?我可以通过在视图中创建表单并访问其值/标签字典来实现.这是最好/唯一的方法吗?
我有一个Person模型,我使用django表单编辑另一个带有外键的对象Person.人物模型有first_name和last_name字段.我想运行一个方法来过滤外部引用的下拉框的结果.
我试图用来values_list()覆盖表单字段选项(选择属性),如下所示:
data.form.fields['person'].choices = GetPersons().values_list('id', 'first_name')
Run Code Online (Sandbox Code Playgroud)
GetPersons() 只过滤Person类
return Person.objects.filter(id__gt=1000)`
Run Code Online (Sandbox Code Playgroud)
例如,所以我只会找到我想要出现的人.我如何使用values_list()返回连接first_name和last_name不必返回字典并手动拆分所有内容?
我有一个来自Apache2的Django Web应用程序,其中mod_wsgi位于Google云平台中Kubernetes集群上运行的docker容器中,受Identity-Aware代理保护.一切都很好,但我想为所有请求发送GCP Stackdriver跟踪,而不为我的项目中的每个视图写一个.我发现使用Opencensus处理这个中间件.我浏览了这个文档,并通过指定StackdriverExporter并将project_id参数作为Project Number我的项目的Google Cloud Platform 传递,手动生成导出到项目中的Stackdriver Trace的跟踪.
现在为了对所有请求进行自动化,我按照说明设置了中间件.在settings.py,我添加模块INSTALLED_APPS,MIDDLEWARE并设置了OPENCENSUS_TRACE选项字典.我还加了OPENCENSUS_TRACE_PARAMS.这个伟大的工程使用默认的出口"opencensus.trace.exporters.print_exporter.PrintExporter",我所看到的跟踪和跨度信息,包括跟踪ID,并在我的Apache2 Web服务器日志的所有细节.但是,我想将这些发送到我的Stackdriver Trace处理器进行分析.
我尝试将EXPORTER参数设置为opencensus.trace.exporters.stackdriver_exporter.StackdriverExporter,只要您提供项目编号,该参数在从shell手动运行时有效.
当设置使用时StackdriverExporter,网页不会响应加载,运行状况检查开始失败,最终网页返回502错误,说我应该在30秒内再试一次(我相信身份识别一旦检测到运行状况检查失败,代理就会生成此错误),但服务器不会生成任何错误,并且Apache2中没有访问日志或错误.
在settings.py中有另一个字典命名OPENCENSUS_TRACE_PARAMS,我认为需要确定导出器应该使用哪个项目编号.该示例GCP_EXPORTER_PROJECT设置为None,并SERVICE_NAME设置为'my_service'.
我需要设置哪些选项才能让导出器发送回Stackdriver而不是打印到日志?你对我如何设置它有什么想法吗?
settings.py
MIDDLEWARE = (
...
'opencensus.trace.ext.django.middleware.OpencensusMiddleware',
)
INSTALLED_APPS = (
...
'opencensus.trace.ext.django',
)
OPENCENSUS_TRACE = {
'SAMPLER': 'opencensus.trace.samplers.probability.ProbabilitySampler',
'EXPORTER': 'opencensus.trace.exporters.stackdriver_exporter.StackdriverExporter', # This one just makes the server hang with no response or error …Run Code Online (Sandbox Code Playgroud) 我有一个模型Person来存储有关人的所有数据。我还有一个Client扩展 Person的模型。我有另一个扩展模型OtherPerson,它也扩展了Person模型。我想创建一个指向 a 的客户端Person,并且还创建一个OtherPerson指向那个的记录Person。基本上,我希望根据当前视图Person将一个对象视为 a Clientand 和 an OtherPerson。这是否可能与 Django 的 ORM 一起使用,或者我是否需要以某种方式编写一个原始查询来创建这个场景。我很确定这在数据库方面是可能的,因为两个子类都将使用其 person_ptr_id 字段指向父 Person 类。
简单地说,如果我创建一个Client(因此Person),我还可以创建一个OtherPerson使用基础对象Person从Client。这样我就可以将它们视为ClientOR 作为OtherPerson,并且保存一个会影响Person每个字段?
“水平”多态性?
这是我的模型的简化版本,以防万一:
class Person(models.Model):
"""
Any person in the system will have a standard set of details, fingerprint hit details, some clearances and items due, like TB …Run Code Online (Sandbox Code Playgroud) 在这种情况下,我的模型并不重要,我认为这是一个基本的Python问题.
假设我有一个项目的查询集,我想计算每个要在模板中显示的东西.
在我看来,我可以创建一个对象列表,对于每个对象,我可以在该对象上设置一个属性进行计算,然后我可以在模板中显示它.或者我可以创建一个字典列表,只获取我需要在每个字典中显示的字段以及计算字段.对于性能和一般实践来说哪个更好?
一个过于简化的示例,为了清晰起见(我知道我可以从模板中调用getAge(),我真正计算的是更复杂的,对于性能,我想在视图代码中进行计算):
models.py:
class Person(models.Model):
first_name = ...
last_name = ...
date_of_birth = ...
.
.
.
def getAge(self):
return ... # return the calculated years since date_of_birth
Run Code Online (Sandbox Code Playgroud)
views.py:
def method1_object_property(request):
people = Person.objects.all()
for p in people:
p.age = p.getAge()
return render_to_response('template.htm', {'people': people})
def method2_dictionary(request):
people = Person.objects.all()
data = list()
for p in people:
row = dict()
row['first_name'] = p.first_name
row['last_name'] = p.last_name
row['age'] = p.getAge()
data.append(row)
return render_to_response('template.htm', {'people': data})
Run Code Online (Sandbox Code Playgroud)
template.htm:
<ul>
{% for …Run Code Online (Sandbox Code Playgroud) 我有以下模型(def __unicode__(...)为了清楚起见,我遗漏了):
class Person(models.Model):
first_name = models.CharField(max_length=64, null=True, blank=True)
middle_name = models.CharField(max_length=32, null=True, blank=True)
last_name = models.CharField(max_length=64, null=True, blank=True)
class MinorResident(Person):
move_in_date = models.DateField(null=True)
move_out_date = models.DateField(null=True)
natural_child = models.NullBooleanField()
class OtherPerson(Person):
associate_all_homes = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)
我有以下视图方法使用MinorResident对象来创建OtherPerson对象,如:
def MinorToAdult(request, minor):
p = Person.objects.get(id=minor.person_ptr_id)
o = OtherPerson(p.id)
o.__dict__.update(p.__dict__)
o.save()
return True
Run Code Online (Sandbox Code Playgroud)
这一切都很好,但我仍然在minoresident表中有一条记录,指向person_ptr_id的人员记录.我在otherperson表中也有一个指针记录,同一个person_ptr_id指向同一个人,并显示切换之前的所有数据,但是使用了OtherPerson对象而不是MinorResident对象.所以,我想删除MinorResident对象,而不删除父类Person对象.我想我可以这样做:
p = Person.objects.get(id=minor.person_ptr_id)
o = OtherPerson()
o.__dict__.update(p.__dict__)
o.save()
minor.delete()
return True
Run Code Online (Sandbox Code Playgroud)
但是如果我能帮助它,我想在Person表中没有新的记录,因为它真的不是一个新人,只是一个现在成年人的人.也许我可以这样做吗?还是有更好的方法来处理模型嬗变?
p = Person.objects.get(id=minor.person_ptr_id)
o = OtherPerson(p.id)
o.__dict__.update(p.__dict__)
o.save()
minor.person_ptr_id = None
minor.delete()
return True
Run Code Online (Sandbox Code Playgroud)
说我有这些模型:
models.py:
class Item(models.Model):
ref_id = models.PositiveIntegerField()
name = models.CharacterField(max_length=32)
class ItemDue(models.Model):
item = models.ForeignKey(Item)
due_date = models.DateField(null=True, blank=True)
lots of other fields below
.
.
.
Run Code Online (Sandbox Code Playgroud)
我想查询ItemDue对象,但也希望包含Item查询.
如果我得到一组ItemDues,我可以像这样循环:
for item_due in ItemDue.objects.filter(some_criteria):
print item_due.item.ref_id
Run Code Online (Sandbox Code Playgroud)
但是,当我进行一些性能测试时,这将返回到数据库以获取引用的Item对象,因此我必须为每个执行另一个查询ItemDue来获取Item.ref_id.这在一个巨大的查询中有所不同,所以我想与查询集Item.ref_id一起得到ItemDues.我可以做.values('id', 'item__ref_id')一个ItemDue带id和的字典item__ref_id.所以,我可以.values('id', 'item__ref_id', ...)用于所有领域,ItemDue但这将是很多工作.有没有一种简单的方法可以附加到查询集的值来获取该引用对象,而不是ItemDue仅仅添加一个额外的字段来拼写所有字段item__ref_id?
谢谢
编辑:
以下是在manage.py shell中运行的一些代码:
def check():
start = datetime.now() …Run Code Online (Sandbox Code Playgroud) 我在网站上有 Django Social Auth(pypi 包social-auth-app-django)与 Google OAuth2 一起使用。
当他们打开页面时,他们会被重定向到 Google 的 OAuth2 身份验证。这非常有效,如果他们尝试使用不在我的限制列表中的电子邮件地址登录,他们会收到 AuthForbidden 异常。我为此添加了一个陷阱,并向他们显示一个不允许他们登录此网站的页面。到目前为止一切都很好。
但是,我希望无效的电子邮件帐户根本不显示在 Google 身份验证页面的列表中。在使用带有参数的 javascript 之前,我已经通过手动调用身份验证页面来完成此操作,但我不确定如何使用罐装 Django 社交身份验证模块来执行此操作。
这可以做到吗?如果可以,怎么做?
我有中间件可以检测用户是否未登录并返回一个 login() 视图,该视图将用户重定向到 Google 身份验证页面。
视图.py
# Login using OAuth2.
@csrf_protect
def login(request):
next_page = request.path
if next_page is None or next_page == '':
next_page = request.POST.get('next', request.GET.get('next', ''))
# Check if they are already logged in and redirect them to the original page if so.
if hasattr(request, 'user') and request.user.is_authenticated:
return HttpResponseRedirect(next_page)
# Otherwise, send them …Run Code Online (Sandbox Code Playgroud) django ×9
python ×4
apache2 ×1
dictionary ×1
django-views ×1
mod-wsgi ×1
object ×1
opencensus ×1
orm ×1
properties ×1
views ×1