我正在try 为一个模型添加注释,该模型包含一个多个字段:

class Link(models.Model):
    products = models.ManyToManyField(Product, related_name = "%(class)s_name", related_query_name = "product_link_qs", blank = True)
    position = models.ForeignKey(Position, on_delete = models.CASCADE)

class Position(models.Model):
    place = models.PositiveIntegerField(unique = True) 
    store = models.ForeignKey(Store, on_delete = models.CASCADE)

class Store(models.Model):
    name = models.CharField("name", max_length = 32)

在我的管理中,我使用annotate()来组合信息:

@admin.register(Link)
class LinkAdmin(admin.ModelAdmin):
    list_display = ["product", "get_store"]
    list_filter = ["position__store"]

    ### extend by product_link_qs related name property to make field sortable in the admin
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.annotate(storename = Product.objects.filter(product_link_qs = OuterRef("id")).values("store__name"))

    @admin.display(description = "store name", ordering = "storename")
    def get_store(self, obj):
        return obj.storename or None

一个职位只有一个产品链接:

这在测试中的SQLite和生产中的MariaDB中工作得非常好

将第二个产品添加到链接:

在测试中打SQLite分,但给出:MariaDBdjango.db.utils.OperationalError: (1242, 'Subquery returns more than 1 row')

推荐答案

可能最简单的方法是用store 的名称对其进行注释:

from django.db.models import F


@admin.register(Link)
class LinkAdmin(admin.ModelAdmin):
    list_display = ['product', 'get_store']
    list_filter = ['position__store']

    ### extend by product_link_qs related name property to make field sortable in the admin
    def get_queryset(self, *args, **kwargs):
        return (
            super()
            .get_queryset(*args, **kwargs)
            .annotate(storename=F('products__store__name'))
            .distinct()
        )

    @admin.display(description='store name', ordering='storename')
    def get_store(self, obj):
        return obj.storename or None

Django相关问答推荐

Django REST framework:object has no attributed after annotation;Got attributeError when try to get a value for field field on serializer<>

无法将关键字average_rating解析为字段

APIView查询未返回任何结果

如何根据状态计算表中数据的数量?

访问默认的 django-allauth 登录和注册页面时出现 TemplateSyntaxError

使用 Crispy Forms 时 Django 返回 'TemplateDoesNotExist'

Django 和 HTML 无法从指定时间开始视频

Django授权判断具有通配符模式的URL

ModelForm 的 Django TextField max_length 验证

我的 django 模板布尔变量在 javascript 中没有按预期工作

变量为无时默认模板标签输出的Django设置?

Django 基于角色的视图?

在 Django 管理员中嵌套内联?

模型 Django 中的 ID 字段

可以在 github 页面上托管 django 站点吗?

Django UrlResolver,在运行时添加 url 进行测试

Django JavaScript 文件

Django urls 直接到 html 模板

如何在 Django 1.9 中删除 DB (sqlite3) 以从头开始?

Django的不区分大小写的网址?