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

标签 python 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_lated() 在 User 和 Address 模型之间进行连接。

我注册了Address模型并重写get_queryset()方法来编写预期的queryset并编写callable来显示用户模型字段.

@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

如果要更改页面名称,请更改地址模型的 verbose_name(例如“用户详细信息”)

class Address(models.Model):
    ...

    class Meta:
        verbose_name = 'User Detail'
        verbose_name_plural = 'User Details'

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

关于python - 在 django 中将两个模型合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75884015/

相关文章:

python - Django Rest Framework 实例化序列化器错误

python - 使用 Panel 时不显示 Altair 图

python - 如何将 for 循环的结果存储为单个数组?

python - 从 Python 访问 Facebook

Python ValueError : not allowed to raise maximum limit

python - 如何使用 View 中的列表在 Django 中创建下拉列表

python - Django 教程 1 - 导入错误 : No module named apps

python - urllib2 通过错误获取响应

Django 按组计数

python - Celery 为每个失败的任务发送邮件