我是第一次使用夹具模块,试图获得更好的夹具数据,这样我就可以使我们的功能测试更加完整.
我发现夹具模块有点笨重,我希望有更好的方法来做我正在做的事情.这是Python 2.7中的Flask/SQLAlchemy应用程序,我们使用nose作为测试运行器.
所以我有一套员工.员工有角色.有几个页面具有相当复杂的权限,我想确保这些页面经过测试.
我创建了一个具有每种角色类型的DataSet(我们的应用程序中大约有15个角色):
class EmployeeData(DataSet):
class Meta:
storable = Employee
class engineer:
username = "engineer"
role = ROLE_ENGINEER
class manager:
username = "manager"
role = ROLE_MANAGER
class admin:
username = "admin"
role = ROLE_ADMIN
Run Code Online (Sandbox Code Playgroud)
我想做的是编写一个功能测试,只检查合适的人可以访问页面.(实际的权限更复杂,我只是想给你一个玩具示例.)
像这样的东西:
def test_only_admin_can_see_this_page():
for employee in Employee.query.all():
login(employee)
with self.app.test_request_context('/'):
response = self.test_client.get(ADMIN_PAGE)
if employee.role == ROLE_ADMIN
eq_(200, response.status_code)
else:
eq_(401, response.status_code)
logout(employee)
Run Code Online (Sandbox Code Playgroud)
有没有办法生成灯具数据,所以我的开发人员不必记得每次添加角色时都要在灯具上添加一行?我们将所有角色的规范列表作为应用程序中其他位置的配置,所以我有.
我没有结合任何这个或夹具模块,所以我很高兴听到建议!
其中一个表的列类型从整数更改为字符串。
Logic(PBase):
__tablename__ = "logic"
Id(Integer, primary_key=True)
Run Code Online (Sandbox Code Playgroud)
此列更改为字符串
Logic(PBase):
__tablename__ = "logic"
Id(String, primary_key=True)
Run Code Online (Sandbox Code Playgroud)
现在我正在使用 alembic 自动生成迁移脚本。为了检测类型更改,我在 env.py 中提供了compare_type=True
with connectable.connect() as connection:
context.configure(
connection=connection,
target_metadata=target_metadata,
compare_type=True
)
Run Code Online (Sandbox Code Playgroud)
这样做,迁移脚本就生成好了。以下是生成的迁移脚本的内容:
from alembic import op # noqa
import sqlalchemy as sa # noqa
def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.alter_column('logics', 'id',
existing_type=sa.INTEGER(),
type_=sa.String())
### end Alembic commands ###
def downgrade():
### commands auto generated by Alembic - please adjust! ###
op.alter_column('logics', 'id',
existing_type=sa.String(),
type_=sa.INTEGER())
### end …Run Code Online (Sandbox Code Playgroud) 令人惊讶的是我找不到通过查询建立组的方法.
我有一个查询集qs,我试图通过组some_prop.val,考虑qs被排除的条目,其中some_prop是None.
让我们说值是[1, 2, 3],然后我会在这样的结果之后:
{1: entries1, 2: entries2, 3: entries3}
Run Code Online (Sandbox Code Playgroud)
Django ORM是否提供任何功能来分组这样的结果?
序幕:
这是SO中经常出现的问题:
我已经在SO文档中编写了一个示例,但由于文档将于2017年8月8日关闭,我将遵循这个广泛上升和讨论的元答案的建议,并将我的示例转换为自我回答的帖子.
当然,我也很乐意看到任何不同的方法!
题:
假设模型:
class Books(models.Model):
title = models.CharField()
author = models.CharField()
price = models.FloatField()
Run Code Online (Sandbox Code Playgroud)
如何使用Django ORM在该模型上执行以下查询:
GROUP BY ... COUNT:
SELECT author, COUNT(author) AS count
FROM myapp_books GROUP BY author
Run Code Online (Sandbox Code Playgroud)GROUP BY ... SUM:
SELECT author, SUM (price) AS total_price
FROM myapp_books GROUP BY author
Run Code Online (Sandbox Code Playgroud)我正在geodjango上构建简单的gis系统.
该应用程序显示一组地图,我也试图为这些地图提供RESTFUL API.
我正在决定是为API创建单独的应用程序还是在现有应用程序内部工作.
这两个应用程序在逻辑上是分开的,但它们共享相同的模型.
那么什么被认为更好?
我想知道是否有办法确定在数据库上启用了 PostGis。
我正在尝试用我的开发机器复制我的生产服务器,但我不确定我的开发机器上的数据库是否启用了 PostGIS 或 postgis_topology 或两者。
我试图四处寻找解决方案,但什么也想不出来。
在这方面的任何建议都会有所帮助。
我正在使用 Django REST 框架,我需要根据请求提供的 GET 参数对列表进行分页。
我知道我可以'PAGINATE_BY': 10在设置中进行设置,但是我想允许调用者在发出请求时指定他们想要分页的号码。
我目前有以下序列化程序:
from api.models import Countries
from rest_framework import serializers
class CountrySerializer(serializers.Serializer):
country_geoname_id = serializers.CharField(required=True)
country_code = serializers.CharField(source="iso", max_length=2L, required=True)
country_name = serializers.CharField(max_length=64L, required=True)
def transform_iso(self, obj, value):
return "country_code"
Run Code Online (Sandbox Code Playgroud)
我尝试了以下观点:
@api_view(['GET'])
def country_list(request):
"""
List all countries
"""
if request.method == 'GET':
queryset = Countries.objects.all()
serializer = CountrySerializer(queryset, many=True, data=request.DATA)
paginate_by = request.GET.get('limit', 10)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
但是我觉得我错过了一些东西,我一直无法从文档中弄清楚。
我应该在序列化程序中还是在视图中进行分页?
提前致谢。
我的模型是:
class Test():
date1 = models.DateTimeField()
date2 = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)
我可以使用以下查询找出date2大于的对象date1:
Test.obejcts.filter(date2__gt=F('date1'))
Run Code Online (Sandbox Code Playgroud)
我想找到所有date2大于date1一年的物体。
如何根据date1和之间的差异找出对象date2?
经过数小时的搜索,我发现了许多相关但无法提供帮助的帖子。
我想要做的是输入例如:10:30 AM 到 TimeField。
在浏览器上的 django rest 框架 API 中,它使用这种上午 10:30 格式 ( '%I:%M %p')。
但是当我使用邮递员来测试它时,输出是 24 小时格式('%H:%M:%S')。我也尝试使用 10:30 PM 作为输入,但我得到的输出是 10:30:00 而不是 22:30:00。
我发现的许多答案都建议settings.py使用以下行更改 TimeField 格式:
TIME_INPUT_FORMATS = ('%I:%M %p',)
Run Code Online (Sandbox Code Playgroud)
但这对我不起作用。
很抱歉我在 django rest 框架方面缺乏经验,因为我还在学习。
这是结果的屏幕截图。在浏览器 API 上:
关于邮递员:
我试图找到一种简单的方法来创建允许同时编辑具有外键关系的两个模型的表单。
经过一些研究,似乎内联表单集非常接近我想要做的。
django 文档提供了这个例子:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)
进而,
>>> from django.forms import inlineformset_factory
>>> BookFormSet = inlineformset_factory(Author, Book, fields=('title',))
>>> author = Author.objects.get(name='Mike Royko')
>>> formset = BookFormSet(instance=author)
Run Code Online (Sandbox Code Playgroud)
让我们假设Author有第二个字段,city。我可以使用fields参数在表单中添加一个城市吗?
如果内联表单集不是要走的路,是否有另一种方法可以生成这种联合表单?
经过更多的研究,我找到了django 模型表单。包括来自 2009 年相关模型的字段,这暗示内联表单集可能不是要走的路。
如果有不同工厂的默认解决方案,我会非常感兴趣。
python ×8
django ×7
sqlalchemy ×2
alembic ×1
django-forms ×1
django-orm ×1
flask ×1
geodjango ×1
group-by ×1
nose ×1
pagination ×1
postgis ×1
postgresql ×1
python-2.7 ×1
timefield ×1