标签: django-orm

django admin list_display 带有计数注释

我想将“注释计数”字段添加到 Django Admin 中的 list_display 中。

模型.py

class Log(models.Model):
    ...
    ip_address = models.GenericIPAddressField(
        verbose_name=_('IP address'),
        db_index=True,
    )
    ...
Run Code Online (Sandbox Code Playgroud)

管理员.py

class LogAdmin(admin.ModelAdmin):
    list_display = (..., 'ip_address', 'ip_address_count', ...)

    def ip_address_count(self, instance):
        return models.Log.objects \
            .filter(ip_address=instance.ip_address) \
            .count()

    ip_address_count.short_description = _('IP Address Count')
Run Code Online (Sandbox Code Playgroud)

它可以很好地处理“大量”SQL 查询。

admin.py我想像这样改进我的:

class Log(models.Model):
    ...

    def get_queryset(self, request):
        qs = super(LogAdmin, self).get_queryset(request)
        qs = qs.values('ip_address') \
               .annotate(ip_address_count=Count('ip_address'))
        return qs

    def ip_address_count(self, instance):
        return instance.ip_address_count
Run Code Online (Sandbox Code Playgroud)

但是,我遇到了错误消息:

'dict' object has no attribute '_meta'

看来我找到了错误发生的原因:

Django 管理员,无法分组依据:异常值:“dict”对象没有属性“_meta”

然而,这并不能帮助我解决问题。

谢谢您的回答。

编辑:如果我不附加 …

python django django-orm django-admin

3
推荐指数
1
解决办法
2310
查看次数

带有排除功能的 Django ORM 查询无法正常工作

我有下面的 Django ORM 查询,其中排除具有 0(零)sale_price 的产品。

selected_attr_values = ProductAttribValue.objects.filter(
    product__status_id=1,
    product_id__in=product_attributes_values.values_list('product_id', flat=True).distinct()
).exclude(
    product__sale_price = 0,
    ifield_value = '',
    field_value__isnull=False
).distinct(
    "field_value",
    'field_id'
).values(
    'field_value',
    'product_id',
    'field__caption',
    'field_id',
    'id'
)
Run Code Online (Sandbox Code Playgroud)

上述查询不排除 sale_price 为 0 的产品。

但在更新查询后,如下所示。

selected_attr_values = ProductAttribValue.objects.filter(
    product__status_id=1,
    product_id__in=product_attributes_values.values_list('product_id', flat=True).distinct()
).exclude(
    field_value='',
    field_value__isnull=False
).distinct(
    "field_value",
    'field_id'
).exclude(
    product__sale_price=0
).values(
    'field_value',
    'product_id',
    'field__caption',
    'field_id',
    'id'
)

Run Code Online (Sandbox Code Playgroud)

它工作正常。

所以我的问题是为什么我需要调用排除两次才能获得所需的输出。

谢谢。

django django-orm python-3.x

3
推荐指数
1
解决办法
2736
查看次数

Django MySql 全文搜索有效,但在测试中无效

我使用这个问题在 Django 应用程序中的 mysql 数据库上启用全文搜索。

# models.py

class CaseSnapshot(BaseModel):
    text = models.TextField(blank=True)


class Search(models.Lookup):
    lookup_name = "search"

    def as_mysql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)
        params = lhs_params + rhs_params
        return f"MATCH (%s) AGAINST (%s IN BOOLEAN MODE)" % (lhs, rhs), params


models.TextField.register_lookup(Search)
Run Code Online (Sandbox Code Playgroud)

因为Django不支持mysql上的全文搜索,所以我们必须添加我们的索引,所以我们修改生成的迁移文件:

# Generated by Django 2.2 on 2020-04-28 03:41

from django.db import migrations, models

# Table details
table_name = "by_api_casesnapshot"
field_name = "text"
index_name = f"{table_name}_{field_name}_index"


class Migration(migrations.Migration):

    dependencies …
Run Code Online (Sandbox Code Playgroud)

mysql django full-text-search django-orm

3
推荐指数
1
解决办法
1566
查看次数

Django 查询集返回 DurationField 值(以秒为单位)

我有两个模型:PostComment(评论与帖子有 FK 关系)。

现在我想返回所有帖子及其“响应时间”。我以格式得到此响应时间timedelta。我可以在几秒钟内收到它吗?我尝试过ExtractSecond,但这不是我想要的:

base_posts_queryset.annotate(
    min_commnet_date=Min("comment_set__date_created"),
    response_time=ExpressionWrapper(F("min_commnet_date") - F("date_created"), output_field=DurationField()),
    response_time_in_sec=ExtractSecond(F("response_time"))
).filter(response_time__isnull=False).values("response_time", "response_time_in_sec")
Run Code Online (Sandbox Code Playgroud)

此代码返回以下对象:

{'response_time': datetime.timedelta(days=11, seconds=74024, microseconds=920107), 'response_time_in_sec': 44}
Run Code Online (Sandbox Code Playgroud)

我想要实现的基本上是调用.seconds结果查询集中的每个项目。我可以在 python 中执行此操作,但是 mb 它可以在数据库级别上完成吗?

python django postgresql django-orm

3
推荐指数
1
解决办法
2972
查看次数

Django 计算子查询中的行数

我需要计算子查询中的行数,这是我的 sqlite 解决方案。

class SQCount(Subquery):
    """Count lines in subquery"""
    template = "(SELECT count(*) FROM (%(subquery)s) _count)"
    output_field = models.IntegerField() 

sub = MyModel.objects.filter(user=OuterRef(OuterRef('id'))).values('id')
qs = qs.annotate(count_total=SQCount(sub))
Run Code Online (Sandbox Code Playgroud)

它适用于 sqlite,但不适用于 MySQL(抱怨“where”子句中的未知列)。任何帮助表示赞赏。

mysql django django-orm

3
推荐指数
1
解决办法
4038
查看次数

我可以通过多少种方式使用 Django ORM 获取 ManyToMany 字段数据?

假设我有两个名为A\xc2\xa0 和 \xc2\xa0的模型B。在 model\xc2\xa0 中B,我有一个ManyToManymodel 字段A,那么我可以通过多少种方式使用 model A\xc2\xa0 从模型 \xc2\xa0获取数据B?:

\n
class A(models.Model):\n    name = models.CharField(...)\n\nclass B(models.Model):\n    a = models.ManyToManyField(A)\n
Run Code Online (Sandbox Code Playgroud)\n

python django many-to-many django-models django-orm

3
推荐指数
1
解决办法
5024
查看次数

Django获取查询执行时间

有没有一种方法可以在不使用django-debug-toolbar 的情况下测量 Django 查询时间?它不是用于调试/日志记录,我需要它显示在网页上,例如about # results (# seconds).

编辑:我在生产模式下需要此功能,所以DEBUG=True不是一个选项

python django postgresql django-orm django-views

3
推荐指数
1
解决办法
9332
查看次数

Django orm 子查询 - 不带替换的子句

我需要使用 Django ORM 构建一个查询,在 SQL 中看起来像这样:

select * from A where id not in (select a_id from B where ... )
Run Code Online (Sandbox Code Playgroud)

我尝试使用这样的代码:

ids = B.objects.filter(...)
a_objects = A.object.exclude(id__in=Subquery(ids.values('a__id'))).all()
Run Code Online (Sandbox Code Playgroud)

问题是 Django 生成的查询不是嵌套选择,而是如下所示

select * from A where id not in (1, 2, 3, 4, 5 ....)
Run Code Online (Sandbox Code Playgroud)

where in 子句显式列出了应排除的所有 id,导致结果 sql 在打印到日志中时不可读。是否可以调整此查询,以便使用嵌套选择?

django django-orm

3
推荐指数
1
解决办法
545
查看次数

过滤ManyToManyField中间表字段

我有一个通常的M2M,在中间表中有一个额外的字段:

class Customer(models.Model):
    items = models.ManyToManyField(Item, verbose_name=u'Items', through='CustomerItem')

class Item(models.Model):
    pass

class CustomerItem(models.Model):
    item = models.ForeignKey(Item, related_name='customer_items')
    customer = models.ForeignKey(Customer, related_name='customer_items')
    item_count = models.PositiveIntegerField(default=0)
Run Code Online (Sandbox Code Playgroud)

我想获得一个查询集,其中包含给定客户的所有项目item_count > 0.我到目前为止找到的唯一方法(从这里开始)是过滤中间表,然后用Python代码创建一个对象列表,但我需要一个查询集(用于表单ChoiceField).

python django many-to-many django-orm

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

如何在Django中从多对多关系中检索数据

我有两个这样的模型:

class GuestStatus(models.Model):
    guest_status = models.CharField(max_length=200)
    arrangement = models.IntegerField(unique=True, help_text="Start from 1. Guest status will be arranged alphabetically.")

class Guest(models.Model):

    user = models.ForeignKey(User)
    full_name = models.CharField(max_length=250)
    street_address = models.CharField(max_length=250, blank=True, null=True)
    city = models.CharField(max_length=150, blank=True, null=True)
    state = models.CharField(max_length=120, blank=True, null=True)
    zip_code = models.CharField(max_length=15, blank=True, null=True)

    status = models.ManyToManyField(GuestStatus, blank=True, null=True)
    invitation_date = models.DateTimeField(blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

我试图在模板中检索数据:

#Views.py:
guests = Guest.objects.filter(user_id=request.user.id)

# Template:
 {% for guest in guests %}
    <tr>
    <td width="5%"><input type="checkbox" value="{{ guest.id }}" name="guest_name" id="{{ forloop.counter }}" /></td> …
Run Code Online (Sandbox Code Playgroud)

django django-models django-orm

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