我想将“注释计数”字段添加到 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”
然而,这并不能帮助我解决问题。
谢谢您的回答。
编辑:如果我不附加 …
我有下面的 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 应用程序中的 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) 我有两个模型:Post,Comment(评论与帖子有 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 它可以在数据库级别上完成吗?
我需要计算子查询中的行数,这是我的 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”子句中的未知列)。任何帮助表示赞赏。
假设我有两个名为A\xc2\xa0 和 \xc2\xa0的模型B。在 model\xc2\xa0 中B,我有一个ManyToManymodel 字段A,那么我可以通过多少种方式使用 model A\xc2\xa0 从模型 \xc2\xa0获取数据B?:
class A(models.Model):\n name = models.CharField(...)\n\nclass B(models.Model):\n a = models.ManyToManyField(A)\nRun Code Online (Sandbox Code Playgroud)\n 有没有一种方法可以在不使用django-debug-toolbar 的情况下测量 Django 查询时间?它不是用于调试/日志记录,我需要它显示在网页上,例如about # results (# seconds).
编辑:我在生产模式下需要此功能,所以DEBUG=True不是一个选项
我需要使用 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 在打印到日志中时不可读。是否可以调整此查询,以便使用嵌套选择?
我有一个通常的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).
我有两个这样的模型:
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 ×10
django-orm ×10
python ×5
many-to-many ×2
mysql ×2
postgresql ×2
django-admin ×1
django-views ×1
python-3.x ×1