Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在django中,可以使用F()对象查看常量是否包含字段中的字符串吗?_Django_Django Models_Django Queryset - Fatal编程技术网

在django中,可以使用F()对象查看常量是否包含字段中的字符串吗?

在django中,可以使用F()对象查看常量是否包含字段中的字符串吗?,django,django-models,django-queryset,Django,Django Models,Django Queryset,全部, 我正在尝试基本上做关键字通知,所以每当创建一个具有名称的对象时,任何想要被通知该名称中任何单词的人都会被拒绝 e、 g. 我已经确定,在django中,可以使用来比较一个字段与另一个字段,如下所示: Entry.objects.filter(n_comments__gt=F('n_pingbacks')) 现在有人知道如何用常量字符串替换第一个字段了吗?像这样: Entry.objects.filter("constant string"__icontains=F('n_pingbac

全部,
我正在尝试基本上做关键字通知,所以每当创建一个具有名称的对象时,任何想要被通知该名称中任何单词的人都会被拒绝
e、 g.

我已经确定,在django中,可以使用来比较一个字段与另一个字段,如下所示:

Entry.objects.filter(n_comments__gt=F('n_pingbacks'))
现在有人知道如何用常量字符串替换第一个字段了吗?像这样:

Entry.objects.filter("constant string"__icontains=F('n_pingbacks'))

或者我是在倒退吗?

你不应该试图与django ORM抗争。它涵盖了最常见的事情,但你的情况并非如此。只需使用
extra
即可获得所需(甚至
raw
)。

您不应尝试与django ORM抗争。它涵盖了最常见的事情,但你的情况并非如此。只需使用
extra
即可获得所需(甚至
raw
)。

您可以通过提供
dict
参数来实现这一点,例如:

Entry.objects.filter(**{("%s__icontains" % constant_string):F('n_pingbacks')})

您可以通过提供参数的
dict
来实现这一点,例如:

Entry.objects.filter(**{("%s__icontains" % constant_string):F('n_pingbacks')})

尝试使用“.extra”选择const as字段,而不是使用myconst\uuu包含,如:

queryset.extra(select={'myconst': "'this superstring is myconst value'"}).filter(myconst__contains=F('myfield'))
不要忘了把常量值放在双引号内的撇号中

但是,有人能帮我把它放到Q对象中吗?=)

UPD: 突然,由于以下问题,它失败了:

也许,他们会修好的

UPD:您可以通过添加“.annotate”的字段进行过滤,但我不知道如何将常量放在这里而不是聚合。也许,通过创建自定义攻击函数,如下所示:

UPD:我制作了自定义聚合器,这个逻辑似乎是正确的,因为我从queryset得到的查询与我想要的非常相似,但是,不幸的是,还有另一个问题:16731(对不起,没有提供完整的url,没有足够的代表,请参阅上面的另一个问题)

UPD(last):我已经通过以下的monkeypatching实现了这一点:

  • django.db.models.sql.Query.Query\u术语
  • django.db.models.fields.Field.get\u prep\u查找
  • django.db.models.fields.Field.get\u db\u prep\u查找
  • django.db.models.sql.where.WhereNode.make_atom

  • 刚定义的自定义查找“启动”,其反向逻辑为“startswith”

    尝试使用“.extra”选择常量作为字段,而不是使用myconst\uu包含,如:

    queryset.extra(select={'myconst': "'this superstring is myconst value'"}).filter(myconst__contains=F('myfield'))
    
    不要忘了把常量值放在双引号内的撇号中

    但是,有人能帮我把它放到Q对象中吗?=)

    UPD: 突然,由于以下问题,它失败了:

    也许,他们会修好的

    UPD:您可以通过添加“.annotate”的字段进行过滤,但我不知道如何将常量放在这里而不是聚合。也许,通过创建自定义攻击函数,如下所示:

    UPD:我制作了自定义聚合器,这个逻辑似乎是正确的,因为我从queryset得到的查询与我想要的非常相似,但是,不幸的是,还有另一个问题:16731(对不起,没有提供完整的url,没有足够的代表,请参阅上面的另一个问题)

    UPD(last):我已经通过以下的monkeypatching实现了这一点:

  • django.db.models.sql.Query.Query\u术语
  • django.db.models.fields.Field.get\u prep\u查找
  • django.db.models.fields.Field.get\u db\u prep\u查找
  • django.db.models.sql.where.WhereNode.make_atom

  • 刚刚定义的自定义查找“启动”,其反向逻辑为“startswith”

    它看起来并不特别漂亮,但可以通过标准过滤器完成

    from django.db.models import ExpressionWrapper, CharField, Value
    
    Entry.objects.annotate(
        my_const=ExpressionWrapper(Value("a constant string"),
                                   output_field=CharField())
    ).filter(my_const__contains=F('n_pingbacks'))
    

    它看起来并不特别漂亮,但可以用标准的过滤器来完成

    from django.db.models import ExpressionWrapper, CharField, Value
    
    Entry.objects.annotate(
        my_const=ExpressionWrapper(Value("a constant string"),
                                   output_field=CharField())
    ).filter(my_const__contains=F('n_pingbacks'))
    

    该死的,我很害怕。我真的不想在
    raw
    中写这篇文章,因为concat是特定于数据库的。这就是为什么ORM中没有这个功能:)它太具体和依赖于数据库,而django提供了对几个数据库的支持。请提供一个例子来说明你的答案。该死,我很害怕。我真的不想在
    raw
    中写这篇文章,因为concat是特定于数据库的。这就是为什么ORM中没有这个功能:)它太具体了,依赖于数据库,而django提供了对几个数据库的支持。请提供一个例子来说明你的答案。这实际上不起作用,除非常量字符串是字段的名称。因为我想搜索任意字符串,而不是我想要的。啊,我明白了。抱歉,误解了这个问题。这实际上不起作用,除非常量字符串是字段的名称。因为我想搜索任意字符串,而不是我想要的。啊,我明白了。对不起,我误解了这个问题。