在django中将两个模型合并为一个



是否有可能在django中将两个模型合并为一个,以便我可以在一个表中显示django管理面板中两个表的所有细节

class User(AbstractUser):
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
email = models.EmailField(unique=True)
phone = models.CharField(max_length=12)
username = models.CharField(max_length=150, null=True)
company_name = models.CharField(max_length=255, null=True, blank=True)
gst_no = models.CharField(max_length=150, blank=True, null=True)

class Address(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE, related_name='address')
street_address = models.CharField(max_length=100)
apartment_address = models.CharField(max_length=100)
country = CountryField(multiple=False)
state = models.CharField(max_length=100,)
city = models.CharField(max_length=100)
zip = models.CharField(max_length=100)
address_type = models.CharField(max_length=1, choices=ADDRESS_CHOICES)
default = models.BooleanField(default=False)
used_in_orders = models.BooleanField(default=False)
display = models.BooleanField(default=True)
def gst_no(self):
return self.user.gst_no if self.user.gst_no else None

我知道有内联方法,但我不。我想在一个单独的表中显示两个模型的所有详细信息

根据您的期望,您希望在Django管理面板上实现此功能。实现这一点的一种方法是使用select_related()在User和Address模型之间使用连接。

我注册地址模型并覆盖get_queryset()方法来编写期望的查询集并写入callable来显示User模型字段。

@admin.register(Address)
class AddressAdmin(admin.ModelAdmin):
list_display = [
'first_name', 'last_name', 'email', 'phone', 'username', 'company_name',
'street_address', 'apartment_address', 'country', 'state', 'city', 'zip', 'address_type', 'default', 'used_in_orders', 'display'
]
def get_queryset(self, request):
queryset = super().get_queryset(request)
queryset = queryset.select_related("user").all()
return queryset
def first_name(self, obj):
return obj.user.first_name
def last_name(self, obj):
return obj.user.last_name
def email(self, obj):
return obj.user.email
def phone(self, obj):
return obj.user.phone
def username(self, obj):
return obj.user.username
def company_name(self, obj):
return obj.user.company_name

如果要更改页面名称,则更改Address模型的verbose_name(例如,'User Detail')

class Address(models.Model):
...
class Meta:
verbose_name = 'User Detail'
verbose_name_plural = 'User Details'

如果你不想使用地址模型,你也可以使用地址的代理模型。

听起来你想创建一个自定义视图,将两个模型中的数据混合到一个表中,并将其添加到Django Admin Site。

Django文档解释了如何创建和集成自定义视图到Django Admin Site。

TL;DR是创建一个Django视图,以你想要的方式显示数据,然后通过覆盖AdminSite类的get_urls方法插入视图。

def get_urls(self):
urls = super().get_urls()
my_urls = [path("my_view/", self.admin_site.admin_view(self.my_view))]
return my_urls + urls

这个StackOverflow线程展示了一个例子,如果你不熟悉的话,你可以在一个视图中混合来自多个表的数据。

最新更新