【问题标题】:Access data from a related class in Django从 Django 中的相关类访问数据
【发布时间】:2012-07-27 18:29:56
【问题描述】:

我有以下代码:

class TelefoneIPInline(admin.StackedInline):
        model = MovimentoTelefoneIP
        extra = 1
        list_filter = ['nome']

class TelefoneIPAdmin(admin.ModelAdmin):
        list_display = ('mac', 'modelo', 'fornecedor', )
        list_filter = ['cliente__nome']
        search_fields = ['mac']
        inlines = [TelefoneIPInline]
        actions = [export_as_csv_action("Exportar para Excel", fields=['mac','modelo','cliente'])]

我想知道是否有办法使用来自 MovimentoTelefoneIP 的字段,它是 TelefoneIP 的一个相关类,作为 list_display、list_display 或操作中的“字段”中的参数。

这是我的模型:

class TelefoneIP(models.Model):
        mac = models.CharField(max_length=12, help_text="Este campo deve ter 12 digitos")
        modelo = models.ForeignKey(ModeloTelefoneIP)
        cliente = models.ForeignKey(Cliente, verbose_name="Cliente Atual")
        fornecedor = models.ForeignKey(Fornecedor)
        datacompra = models.DateField(verbose_name="Data de compra", null=True, blank=True)
        nfcompra = models.IntegerField(verbose_name="Nota fiscal de compra", blank=True, null=True)
        obs = models.TextField(max_length=500, null=True, blank=True)

class MovimentoTelefoneIP(models.Model):
        equipamento = models.ForeignKey(TelefoneIP)
        cliente = models.ForeignKey(Cliente)
        nfvenda = models.IntegerField(verbose_name="Nota fiscal de saída", null=True, blank=True)
        datavenda = models.DateField(verbose_name="Data de saída", null=True, blank=True)

谢谢。

尝试了克里斯的回答:

class TelefoneIPAdmin(admin.ModelAdmin):
        cliente = MovimentoTelefoneIP.objects.all()
        list_display = ('mac', 'modelo','get_clientes')
        search_fields = ['mac']
        list_filter = ['get_clientes']
        def get_clientes(self, obj):
                clientes = [m.cliente for m in obj.MovimentoTelefoneIP_set.all()]
                return u', '.join(clientes)
        get_clientes.short_description = 'Clientes'
        inlines = [TelefoneIPInline]
        actions = [export_as_csv_action("Exportar para Excel", fields=['mac','modelo','fornecedor'])]

【问题讨论】:

    标签: python django


    【解决方案1】:

    只需在您的 ModelAdmin 上创建一个返回其值的方法:

    list_display('get_related_field')
    ...
    def get_related_field(self, obj):
        return obj.related_object.some_field
    get_related_field.short_description = 'Some Field' # Column header
    get_related_field.admin_order_field = 'related_object__some_field'
    

    您可能应该添加:

    list_select_related = True
    

    同样如此,这样它就不会每次都生成查询。

    更新

    不,这是不正确的。你想要这样的东西:

     def get_clientes(self, obj):
        clientes = [m.cliente for m in obj.movimentotelefoneip_set.all()]
        return u', '.join(clientes)
     get_clientes.short_description = 'Clientes'
    

    【讨论】:

    • 如果关系是在内联类中完成的,它是否有效? foreignKey 不在主类中。
    • 这真的与它无关。这一切都基于模型而不是它们各自的管理配置。但是,在这种情况下它不起作用,因为不只是一个相关对象,而是许多相关对象。您需要遍历 obj.movimentotelefoneip_set.all() 并构造某种可以返回的字符串。
    • 要进行这种查询,我是否在views.py中使用相同的方式?
    • 对于list_display 而言,这一切都是为了获取您想要以某种字符串形式呈现的任何数据,这些数据可以打印到屏幕上。你是否需要在你的视图中做同样的事情完全取决于你试图在你的视图中做什么。但是,很可能不会,因为您通常只需将查询集传递到上下文中并让您的模板确定它的呈现方式。
    • 我要做的是显示模型的所有行,其中 cliente(customer) = Google, Google 在字段 Cliente 的内联类中。我想在我的 list_display 中添加客户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多