You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django跨应用使用@property遇阻:无法在钱包应用Admin调用用户属性

问题解决:Django跨应用Admin内联调用@property属性

问题场景

在Django的两个应用(user和wallet)中,尝试在wallet应用的Admin内联中调用user模型定义的full_name属性时失败,相关代码如下:

user.models.py

class user(models.Model):
    name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    wallet = models.ForeignKey(Wallet, on_delete=models.CASCADE)

    @property
    def full_name(self)
        return self.name + self.last_name

wallet.models.py

class wallet(models.Model):
     amount = models.IntegerField()

wallet.admin.py

class UserrInline(admin.TabularInline):
    list_display = ['full_name'] #无法在用户应用中使用该属性

class walletAdmin(admin.ModelAdmin):
    inlines = [UserrInline]

admin.site.register(wallet, walletAdmin)

问题原因

  1. 模型类名不符合规范:Django模型类需用大驼峰命名(如User而非user),否则会引发外键引用、Admin注册等隐性错误。
  2. Inline未指定关联模型:UserrInline未通过model属性明确关联目标模型,Admin无法识别数据来源。
  3. TabularInline不支持list_display:Django内联类不使用list_display配置字段,需通过fields或readonly_fields定义展示内容,且直接调用@property需自定义方法中转。
  4. 语法错误:full_name方法定义缺少冒号,导致属性无法正常生效。

解决方案

步骤1:修正模型类名与语法

user.models.py

from django.db import models
from wallet.models import Wallet

class User(models.Model):
    name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    wallet = models.ForeignKey(Wallet, on_delete=models.CASCADE)

    @property
    def full_name(self):
        return f"{self.name} {self.last_name}"

wallet.models.py

from django.db import models

class Wallet(models.Model):
     amount = models.IntegerField()

步骤2:修正Admin内联配置

wallet.admin.py

from django.contrib import admin
from .models import Wallet
from user.models import User

class UserInline(admin.TabularInline):
    model = User
    readonly_fields = ['get_full_name']
    fields = ['get_full_name']
    extra = 0

    def get_full_name(self, obj):
        return obj.full_name
    get_full_name.short_description = 'Full Name'

class WalletAdmin(admin.ModelAdmin):
    inlines = [UserInline]

admin.site.register(Wallet, WalletAdmin)

额外优化(可选)

若需让full_name支持排序,可添加排序字段关联:

def get_full_name(self, obj):
    return obj.full_name
get_full_name.short_description = 'Full Name'
get_full_name.admin_order_field = 'name'  # 按name字段排序

内容的提问来源于stack exchange,提问作者parvaneh moradi pasha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:01:15