如何将django Model对象转换为包含其所有字段的dict ?理想情况下,所有内容都包含外键和带有editable = False的字段.
让我详细说明一下.假设我有一个类似以下的django模型:
from django.db import models
class OtherModel(models.Model): pass
class SomeModel(models.Model):
normal_value = models.IntegerField()
readonly_value = models.IntegerField(editable=False)
auto_now_add = models.DateTimeField(auto_now_add=True)
foreign_key = models.ForeignKey(OtherModel, related_name="ref1")
many_to_many = models.ManyToManyField(OtherModel, related_name="ref2")
Run Code Online (Sandbox Code Playgroud)
在终端中,我做了以下事情:
other_model = OtherModel()
other_model.save()
instance = SomeModel()
instance.normal_value = 1
instance.readonly_value = 2
instance.foreign_key = other_model
instance.save()
instance.many_to_many.add(other_model)
instance.save()
Run Code Online (Sandbox Code Playgroud)
我想将其转换为以下字典:
{'auto_now_add': datetime.datetime(2015, 3, 16, 21, 34, 14, 926738, tzinfo=<UTC>),
'foreign_key': 1,
'id': 1,
'many_to_many': [1],
'normal_value': 1,
'readonly_value': 2}
Run Code Online (Sandbox Code Playgroud)
回答不满意的问题:
我有两个型号A和B.所有B对象都有一个对象的外键A.给定一组A对象,无论如何都要使用ORM来获取B包含为每个A对象创建的最新对象的一组对象
这是一个简化的例子:
class Bakery(models.Model):
town = models.CharField(max_length=255)
class Cake(models.Model):
bakery = models.ForeignKey(Bakery, on_delete=models.CASCADE)
baked_at = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)
所以我正在寻找一个可以返回美国Anytown每家面包店最新蛋糕的查询.
我有一个这样的模型
class Task(models.Model):
progress = models.PositiveIntegerField()
estimated_days = models.PositiveIntegerField()
Run Code Online (Sandbox Code Playgroud)
现在我想Sum(progress * estimated_days)在数据库级别进行计算.使用Django聚合我可以得到每个字段的总和,但不能得到字段乘法的总和.
我正在使用django 1.6与Mysql
我有这个型号
class Student(models.Model):
username = models.CharField(max_length=200, unique = True)
class Score(models.Model)
student = models.ForeignKey(Student)
date = models.DateTimeField()
score = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
现在我想获得每个学生的最新成绩记录.
我试过了
Score.objects.values('student').annotate(latest_date=Max('date'))
Run Code Online (Sandbox Code Playgroud)
我也试过了
Score.objects.values('student__username').annotate(latest_date=Max('date'))
Run Code Online (Sandbox Code Playgroud)
如描述Django ORM - 获取组的最新记录, 但它没有帮助.
为了测试,我将MYSQL(RDS)参数修改如下;
wait_timeout = 40(默认为 28800)
max_allowed_packet = 1GB(最大 - 只是为了确保问题不是由小数据包引起的)
net_read_timeout = 10
Interactive_timeout 不变
然后在没有pool_pre_ping设置选项的情况下测试我的应用程序(默认为 False),使应用程序保持非活动状态 40 秒,尝试登录,然后我得到
Nov 14 20:05:20 ip-172-31-33-52 gunicorn[16962]: Traceback (most recent call last):
Nov 14 20:05:20 ip-172-31-33-52 gunicorn[16962]: File "/var/www/api_server/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
Nov 14 20:05:20 ip-172-31-33-52 gunicorn[16962]: context)
Nov 14 20:05:20 ip-172-31-33-52 gunicorn[16962]: File "/var/www/api_server/venv/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 507, in do_execute
Nov 14 20:05:20 ip-172-31-33-52 gunicorn[16962]: cursor.execute(statement, parameters)
Nov 14 20:05:20 ip-172-31-33-52 gunicorn[16962]: File "/var/www/api_server/venv/lib/python3.6/site-packages/MySQLdb/cursors.py", line 206, in execute
Nov 14 20:05:20 …Run Code Online (Sandbox Code Playgroud) @pytest.fixture
def d_service():
c = DService()
return c
# @pytest.mark.asyncio # tried it too
async def test_get_file_list(d_service):
files = await d_service.get_file_list('')
print(files)
Run Code Online (Sandbox Code Playgroud)
然而,却出现了以下错误?
已收集 0 项 / 1 错误
===================================== 错误============== =====================
________________ 收集测试/e2e_tests/test_d.py 时出错 _________________
..\..\..\..\..\anaconda3\lib\site-packages\pluggy\__init__.py:617: 在 __call__ 中
返回 self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
..\..\..\..\..\anaconda3\lib\site-packages\pluggy\__init__.py:222: 在 _hookexec 中
返回 self._inner_hookexec(钩子、方法、kwargs)
..\..\..\..\..\anaconda3\lib\site-packages\pluggy\__init__.py:216:在
第一个结果=hook.spec_opts.get('第一个结果'),
..\..\..\..\..\anaconda3\lib\site-packages\_pytest\python.py:171:在 pytest_pycollect_makeitem 中
res = 结果.get_result()
..\..\..\..\..\anaconda3\lib\site-packages\anyio\pytest_plugin.py:98:在 pytest_pycollect_makeitem 中
标记=collector.get_closest_marker('anyio')
E AttributeError:“模块”对象没有属性“get_closest_marker”
!!!!!!!!!!!!!!!!!!!!! 已中断:收集期间出现 1 个错误!!!!!!!!!!!!!!!!!!
=========================== 2.53 秒内出现 1 个错误 ================== =========
我安装了以下软件包。错误消失,但测试被跳过。
pip install …Run Code Online (Sandbox Code Playgroud) 我想使用 fastAPI 从函数内的 API 中检索特定标头,但我找不到解决方案。
在烧瓶中很简单:request.headers['your-header-name']
为什么 fastAPI 做这么简单的事情却这么复杂?
有人知道检索标头的解决方案吗?谢谢 :)
装饰者:
def token_required(f):
@wraps(f)
def decorator(*args, **kwargs):
CONFIG = settings.read_config()
token = None
headers = Request.headers
if "Authorization" in headers:
auth_header = Request.headers
token = auth_header
elif not token:
return {"Error": "Token is missing or incorrect header name"}, 401
try:
public_key = CONFIG["APPLICATION"]["PUBLIC_KEY"]
claim = jwt.decode(token, public_key)
claim.validate()
except UnicodeDecodeError as err:
return {"Error": f"An error occurred -> {err} check your token"}, 401
return f(*args, **kwargs)
return decorator …Run Code Online (Sandbox Code Playgroud) 请参阅此链接:https : //docs.python.org/3/c-api/long.html#c.PyLong_FromLong
当前的实现为 -5 到 256 之间的所有整数保留了一个整数对象数组;当您在该范围内创建一个 int 时,您实际上只是取回了对现有对象的引用。所以,应该可以改变 1 的值。我怀疑 Python 的行为,在这种情况下,是 undefined。:-)
在这种情况下,粗线是什么意思?
我收到一个错误,GET/POST参数的数量超出了设置.DATA_UPLOAD_MAX_NUMBER_FIELDS.Error在/ api/upload上说TooManyFieldsSent GET/POST参数的数量超出了settings.DATA_UPLOAD_MAX_NUMBER_FIELDS.我在views.py中写道
def upload(request):
id, array = common(request)
if request.FILES:
file = request.FILES['req'].temporary_file_path()
else:
return HttpResponse('<h1>NG</h1>')
return HttpResponse('<h1>OK</h1>')
def common(request):
id = json_body.get("access", "0")
if id == "":
id = "0"
s = []
with open(ID_TXT, 'r') as f:
for line in f:
s += list(map(int, line.rstrip().split(',')[:-1]))
array = [s[i:i + 2] for i in range(0, len(s), 2)]
return id, array
Run Code Online (Sandbox Code Playgroud)
我认为这个错误是能够发送文件大小的限制,所以我在settings.py中添加了一个代码
DATA_UPLOAD_MAX_MEMORY_SIZE = 100000000
Run Code Online (Sandbox Code Playgroud)
但错误无法解决.我读了这个页面如何避免"超出GET/POST参数的数量"错误?作为参考.我该如何解决这个问题?
我最近遇到了一些奇怪的行为,需要检查一下我的理解.
我在模型中使用了一个简单的过滤器,然后迭代结果.
例如
allbooks = Book.objects.filter(author='A.A. Milne')
for book in allbooks:
do_something(book)
Run Code Online (Sandbox Code Playgroud)
奇怪的是,它只返回了部分书籍清单.
但是,当使用相同的代码并使用iterator()时,这似乎运行良好.
即
for book in allbooks.iterator():
do_something(book)
Run Code Online (Sandbox Code Playgroud)
知道为什么??
ps我确实浏览了django文档,但看不到qeuryset如何在其他任何地方缓存...
iterator()计算QuerySet(通过执行查询)并在结果上返回迭代器.QuerySet通常在内部缓存其结果,以便重复的评估不会导致其他查询;iterator()而是直接读取结果,而不在QuerySet级别进行任何缓存.对于返回大量对象的QuerySet,这通常会带来更好的性能并显着降低内存请注意,
iterator()在已经评估过的QuerySet 上使用将强制它再次进行评估,重复查询.
python ×9
django ×6
django-orm ×2
cpython ×1
dictionary ×1
fastapi ×1
flask ×1
iterator ×1
mysql ×1
pytest ×1