Nin*_*ino 5 django django-models
我有一个关于Django的设计问题。我不太确定如何将应用程序松散耦合的原理应用于此特定问题:
我有一个订单应用程序(在线商店中)管理订单。在此订单应用程序中,我有两个类:
class Order(models.Model):
# some fields
def order_payment_complete(self):
# do something when payment complete, ie. ship products
pass
class Payment(models.Model):
order = models.ForeignKey(Order)
# some more fields
def save(self):
# determine if payment has been updated to status 'PAID'
if is_paid:
self.order.order_payment_complete()
super(Payment, self).save()
Run Code Online (Sandbox Code Playgroud)
现在的实际问题是:我有一个更专业的应用程序,可以扩展此顺序。因此,它向其中添加了更多字段,等等。例如:
class SpecializedOrder(Order):
# some more fields
def order_payment_complete(self):
# here we do some specific stuff
pass
Run Code Online (Sandbox Code Playgroud)
现在,当然,预期的行为如下:我创建一个SpecializedOrder,放置此订单的付款,并order_payment_complete()调用SpecializedOrder 的方法。但是,由于“付款”链接到“订单”而不是“ SpecializedOrder”,因此order_payment_complete()将调用基本“订单” 的方法。
我真的不知道实现这种设计的最佳方法。也许我已经完全不了解了-但是我想构建此订单应用程序,以便可以将其用于多种用途,并希望使其尽可能通用。
如果有人可以在这里帮助我,那就太好了!谢谢,尼诺
我认为您正在寻找的是ContentTypes 框架中的GenericForeignKey ,该框架随 Django 一起提供在 contrib 包中。它负责记录子类实例的类型和 ID,并提供一种无缝方式来访问子类作为模型上的外键属性。
在你的情况下,它看起来像这样:
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
class Payment(models.Model):
order_content_type = models.ForeignKey(ContentType)
order_object_id = models.PositiveIntegerField()
order = generic.GenericForeignKey('order_content_type', 'order_object_id')
Run Code Online (Sandbox Code Playgroud)
您不需要执行任何特殊操作即可使用此外键...泛型透明地处理设置和保存order_content_type和order_object_id字段:
s = SpecializedOrder()
p = Payment()
p.order = s
p.save()
Run Code Online (Sandbox Code Playgroud)
现在,当您的Payment保存方法运行时:
if is_paid:
self.order.order_payment_complete() # self.order will be SpecializedOrder
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
624 次 |
| 最近记录: |