小编Kes*_*iya的帖子

如何将 select_lated 与 Django create() 一起使用?

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)

django django-queryset

7
推荐指数
1
解决办法
501
查看次数

DRF SerializerMethodField 未被调用

这是我的序列化器:

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 方法也没有被调用。

我在这里做错了什么?

django django-rest-framework

6
推荐指数
1
解决办法
3091
查看次数

如何在 Django 中注释 JSON 字段?

我有一个这样的模型:

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)

那么我该怎么做才能让一切按预期进行呢?

mysql django

2
推荐指数
1
解决办法
1928
查看次数

如何在 Django 注释中获得布尔结果?

我有一个过滤器,它应该返回一个包含 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 新手,所以我做错了什么,应该使用什么注释来获取如上所示的所需对象?

django django-queryset django-rest-framework

1
推荐指数
2
解决办法
2672
查看次数

为什么 pipelinev 告诉我 python 版本错误?

我使用以下方法创建了一个虚拟环境:

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)

python pip virtualenv virtualenvwrapper pipenv

0
推荐指数
1
解决办法
8785
查看次数

如何使用python f字符串替换format()?

我在我的 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

python python-3.x

-2
推荐指数
1
解决办法
56
查看次数