我正在为一种电子商务开发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中,而不是在帐户主页的列中)
这是预期结果的示例,但具有不同的示例。
1条答案
按热度按时间xtfmy6hx1#
实现没有外键的表格内联是困难的。
如果您想以表格形式显示订单项的数据,请按用户的方式。您可以实现一个简单的解决方案。
首先,在用户列表页面中创建一个按钮来查看订单项。单击后,您将重定向到订单项管理更改列表页面,在那里您可以看到过滤结果。