我的一个模型有一个删除标志,用于全局隐藏对象:
class NondeletedManager(models.Manager):
"""Returns only objects which haven't been deleted"""
def get_query_set(self):
return super(NondeletedManager, self).get_query_set().exclude(deleted=True)
class Conversation(BaseModel):
...
deleted = models.BooleanField(default=False)
objects = NondeletedManager()
all_conversations = models.Manager() # includes deleted conversations
Run Code Online (Sandbox Code Playgroud)
如何覆盖Django管理模块使用的默认查询集以包含已删除的对话?
我正在使用django 1.8.我在django admin中显示了一个多对多的字段,就像这个例子一样.
class PurchaseOrder(models.Model):
product = models.ManyToManyField('Product')
vendor = models.ForeignKey('VendorProfile')
dollar_amount = models.FloatField(verbose_name='Price')
class Product(models.Model):
products = models.CharField(max_length=256)
def __unicode__(self):
return self.products
class PurchaseOrderAdmin(admin.ModelAdmin):
fields = ['product', 'dollar_amount']
list_display = ('get_products', 'vendor')
def get_products(self, obj):
return "\n".join([p.products for p in obj.product.all()])
Run Code Online (Sandbox Code Playgroud)
问题是如果我每页显示100行,它会进行100次查询.对于外键,有一个神奇的list_select_related,但你不能在那里放置多对多字段.如何避免重复查询?
---更新:
我试过了:
def get_queryset(self, request):
qs = super(PurchaseOrderAdmin, self).get_queryset(request)
return qs.prefetch_related('products')
Run Code Online (Sandbox Code Playgroud)
它仍在每行执行重复查询.
contrib.auth 中的 admin.py 定义了在管理界面为用户显示的字段:
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
Run Code Online (Sandbox Code Playgroud)
我想在这里看到每个用户的组:

仅用于测试目的,当您尝试添加“组”字段时,它会失败:
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'group')
Run Code Online (Sandbox Code Playgroud)
出现此错误: : (admin.E109) 'list_display[5]' 的值不能是 ManyToManyField。
搜索后,我只找到了将应用程序添加到管理界面或创建自定义用户模型的方法,但我想我错过了一些东西。
那么,该怎么做呢?
已解决--- 感谢@{Alexis No} 的回答
编辑 /usr/local/lib/pyton2.7/dist-packages/django/contrib/auth/admin.py
就在 list_display 之前添加这个寻找组的定义:
def group(self, user):
groups = []
for group in user.groups.all():
groups.append(group.name)
return ' '.join(groups)
group.short_description = 'Groups'
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'group')
Run Code Online (Sandbox Code Playgroud)
然后同步数据库,并在 admin 检查更改,注意最后一列:

我有 2 个应用程序:Visitors和Meetings,通过一个ManytoMany字段链接:
访客/models.py:
from django.db import models
from meetings.models import Meeting
class Visitor(models.Model):
visitor_name = models.CharField(default='name', max_length=128, blank=False, null=False)
visitor_meetings = models.ManyToManyField(Meeting)
def __str__(self):
return self.visitor_name
Run Code Online (Sandbox Code Playgroud)
会议/models.py:
from django.db import models
from team.models import Team
class Meeting(models.Model):
team_member = models.ForeignKey(Team)
meeting_name = models.CharField(default='name', max_length=128, blank=True, null=True)
def __str__(self):
return self.meeting_name
Run Code Online (Sandbox Code Playgroud)
我知道list_display在Visitors管理面板中获取会议的正确方法在这里:https : //stackoverflow.com/a/18108586/2429989。
但是,如何list_display在Meetings管理面板的每次会议上为访客显示?我试过了:
会议/admin.py:
from django.contrib import admin
from .models import Meeting …Run Code Online (Sandbox Code Playgroud)