相关疑难解决方法(0)

在Django admin中覆盖默认查询集

我的一个模型有一个删除标志,用于全局隐藏对象:

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 django-models django-admin

64
推荐指数
3
解决办法
4万
查看次数

如何在列表中显示多对多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)

它仍在每行执行重复查询.

django-admin

8
推荐指数
1
解决办法
657
查看次数

在管理界面显示用户组?

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 检查更改,注意最后一列:

在此处输入图片说明

python django

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

管理面板中多对多字段的 List_display

我有 2 个应用程序:VisitorsMeetings,通过一个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_displayVisitors管理面板中获取会议的正确方法在这里:https : //stackoverflow.com/a/18108586/2429989

但是,如何list_displayMeetings管理面板的每次会议上为访客显示?我试过了:

会议/admin.py:

from django.contrib import admin
from .models import Meeting …
Run Code Online (Sandbox Code Playgroud)

django django-models django-admin

5
推荐指数
1
解决办法
6679
查看次数

标签 统计

django ×3

django-admin ×3

django-models ×2

python ×1