Django Admin -添加一个引用到另一个类的tabularInline部分(没有外键)

owfi6suc  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(127)

我正在为一种电子商务开发Django管理界面。
我有一些数据库模型链接使用外键。
在Django管理界面中,我想在客户页面中显示一个TabularInline部分,以显示特定客户购买的所有项目,但我有一个关于“外键”的经典错误,因为客户模型和OrderItems模型没有直接链接。

class Customer(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), unique=True)
    name = models.CharField(max_length=150)
    mobile = models.CharField(max_length=20, blank=True)
    is_active = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    objects = CustomAccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name']

    class Meta:
        verbose_name = "Account"
        verbose_name_plural = "Accounts"

    def email_user(self, subject, message):
        send_mail(
            subject,
            message,
            'l@1.com',
            [self.email],
            fail_silently=False,
        )

    def __str__(self):
        return self.email
class Order(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                            on_delete=models.CASCADE,
                            related_name="order_user")

    full_name = models.CharField(max_length=50)
    email = models.EmailField(max_length=254, blank=True)
    address1 = models.CharField(max_length=250)
    address2 = models.CharField(max_length=250)
    city = models.CharField(max_length=100)
    phone = models.CharField(max_length=100)
    postal_code = models.CharField(max_length=20)
    country_code = models.CharField(max_length=4, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    total_paid = models.DecimalField(max_digits=5, decimal_places=2)
    order_key = models.CharField(max_length=200)
    payment_option = models.CharField(max_length=200, blank=True)
    billing_status = models.BooleanField(default=False)

    class Meta:
        ordering = ("-created",)

    def __str__(self):
        return str(self.created)

class OrderItem(models.Model):
    order = models.ForeignKey(Order, related_name="items", on_delete=models.CASCADE)

    product = models.ForeignKey(ToolTable,
                                related_name="order_items",
                                on_delete=models.CASCADE)

    price = models.DecimalField(max_digits=5, decimal_places=2)
    quantity = models.PositiveIntegerField(default=1)

    def __str__(self):
        return str(self.id)
class ToolTable(models.Model):

       
    basic = models.CharField(
        max_length=20,
        null=False,
        unique=True,
        blank=False,
        verbose_name=_("basic"),
        help_text=_("format: required, unique, max-100"),
    )

    P_Name = models.CharField(
        max_length=20,
        null=False,
        unique=False,
        blank=False,
        verbose_name=_("P_Name"),
        help_text=_("format: required, max-100"),
    )

    
    def __str__(self):
        return self.P_Name
  • 考虑到OrderItems链接到Order,而Order又链接到Customer,在OrderItems模型中创建一个foreignKey来将这个类链接到Customer类是一个好的解决方案吗?
  • 可能是冗余问题?
  • 保存我的实际数据库结构的替代解决方案是什么?
    (考虑到我试图使用list_display检索方法,但我希望数据在TabularInline中,而不是在帐户主页的列中)
    这是预期结果的示例,但具有不同的示例。

xtfmy6hx

xtfmy6hx1#

实现没有外键的表格内联是困难的。
如果您想以表格形式显示订单项的数据,请按用户的方式。您可以实现一个简单的解决方案。
首先,在用户列表页面中创建一个按钮来查看订单项。单击后,您将重定向到订单项管理更改列表页面,在那里您可以看到过滤结果。

from django.shortcuts import reverse
from django.utils.html import format_html

@admin.register(YourUserModel)
class YourUserModelAdmin(BaseUserAdmin):
    ...
    # add user_order_item is list_display
    list_display = ['user_order_item']
    def user_order_item(self, obj):
        redirect_url = "%s?order__user__id__exact=%s" % (reverse('admin:{}_{}_changelist'.format(self.opts.app_label, OrderItem._meta.model_name)), obj.id)
        return format_html('<a class="button" href="{}">View</a>', redirect_url)

@admin.register(OrderItem)
class OrderItemAdmin(admin.ModelAdmin):
    list_display = ['full_name', 'order_key', 'total_paid', 'billing_status']
    list_filter = ['order__user']

相关问题