class Parent(models.Model):
# some fields
class Child(models.Model):
parent = models.ForeginKey(Parent)
species = models.ForeignKey(Species)
# other fields
Run Code Online (Sandbox Code Playgroud)
我有一个这样的函数:
1. def some_function(unique_id):
2. parent_object = Parent.objects.get(unique_id=unique_id)
3. new_child = Child.objects.create(name='Joe', parent=parent_object)
4. call_some_func(new_child.parent.name, new_child.species.name)
Run Code Online (Sandbox Code Playgroud)
在第 4 行中,为 生成了一个数据库查询Species。有什么办法,我可以使用 select_lated 来预取Species,以防止额外的查询。
可以在我使用的时候完成吗.create()?这只是一个例子,我也使用许多其他字段,它们每次都查询数据库。
我能想到的唯一方法是在第 3 行之后使用以下代码:
child_obj = Child.objects.select_related('species').get(id=new_child.id)
Run Code Online (Sandbox Code Playgroud) 这是我的序列化器:
class MetaDataSerializer(serializers.Serializer):
bg_colors = ColorSerializer(Color.objects.all(), many=True)
button_choices = serializers.SerializerMethodField()
class Meta:
fields = ('bg_colors', 'button_choices')
def get_button_choices(self, obj):
return {
'save': 1, 'continue': 2, 'cancel': 3, 'back': 4
}
Run Code Online (Sandbox Code Playgroud)
我从我的角度调用这个序列化器,如下所示:
class MetaDataView(RetrieveAPIView):
serializer_class = MetaDataSerializer
def get(self, request, *args, **kwargs):
return Response(self.get_serializer().data)
Run Code Online (Sandbox Code Playgroud)
在响应中我只得到了bg_colors字段。响应中缺少另一个字段,并且它的 get_field 方法也没有被调用。
我在这里做错了什么?
我有一个这样的模型:
class MyModel(models.Model):
details = models.JSONField()
# other fields
Run Code Online (Sandbox Code Playgroud)
我想注释这个模型中的一些字段,如下所示:
qs = MyModel.objects.filter(id__in=given_list).annotate(
first_name=F('details__first_name'),
last_name=F('details__last_name')
)
Run Code Online (Sandbox Code Playgroud)
但是,该F()表达式不考虑 json 键,它仅返回详细信息字段。
我正在使用 MySQL,所以无法使用KeyTextTransform.
我尝试像这样使用 RawSQL:
qs = MyModel.objects.filter(id__in=given_list).annotate(
first_name=RawSQL("(details->%s)", ('first_name',)),
last_name=RawSQL("(details->%s)", ('last_name',))
)
Run Code Online (Sandbox Code Playgroud)
但它给出了这个错误:
MySQLdb._exceptions.OperationalError: (3143, 'Invalid JSON path expression. The error is around character position 1.')
Run Code Online (Sandbox Code Playgroud)
那么我该怎么做才能让一切按预期进行呢?
我有一个过滤器,它应该返回一个包含 2 个对象的查询集,并且应该有一个不同的字段。例如:
obj_1 = (name='John', age='23', is_fielder=True)
obj_2 = (name='John', age='23', is_fielder=False)
Run Code Online (Sandbox Code Playgroud)
两个对象具有相同的模型,但主键不同。我尝试使用以下过滤器:
qs = Model.objects.filter(name='John', age='23').annotate(is_fielder=F('plays__outdoor_game_role')=='Fielder')
Run Code Online (Sandbox Code Playgroud)
我第一次使用注释,但它给了我以下错误:
TypeError: QuerySet.annotate() received non-expression(s): False.
Run Code Online (Sandbox Code Playgroud)
我是 Django 新手,所以我做错了什么,应该使用什么注释来获取如上所示的所需对象?
我使用以下方法创建了一个虚拟环境:
mkvirtualenv env_name --python=python3.9
Run Code Online (Sandbox Code Playgroud)
然后我尝试从 Pipfile 安装:
pipenv install --dev
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
pipenv.patched.notpip._internal.exceptions.UnsupportedPythonVersion: pylint requires Python '~=3.6' but the running Python is 2.7.17
Run Code Online (Sandbox Code Playgroud)
我检查了我的Python版本,它是正确的:
$ python --version
Python 3.9.1
Run Code Online (Sandbox Code Playgroud)
为什么它告诉我我的 python 版本是 2.7.17?当我使用以下命令安装时,不会发生这种情况:
pip install pylint==2.7.2
Run Code Online (Sandbox Code Playgroud) 我在我的 constants.py 文件中保存了一些网址,如下所示:
BASE_URL = 'https://{env}.my-site.com'
ENV_URLS = {
'dev': BASE_URL.format(env='dev'),
'demo': BASE_URL.format(env='demo'),
'prod': BASE_URL.format(env='prod')
}
Run Code Online (Sandbox Code Playgroud)
这是使用 old 完成的.format(),如何使用 python 的 new 实现相同的结果f-string formatting?