我的Django项目中有一些模型是基础模型类的子类。例如:
class A(Model):
pass
class B(A):
pass
class C(A):
pass
例如,在线购物我会Ebook
,CD
,Ball
。我可以与OneToOne
创建OneToOneField
关系,但我认为在这种情况下,用户必须填写两个表单,首先他可能填写产品字段,然后填写电子书字段等表单。
此外,我想在产品列表中列出数据库中的产品,即Ebook或Movie或CD Player或其他任何类型的产品。
所以我决定用这种方式创建模型。
问题出现在view
部分,我必须决定填写哪个模板.nelow是我决定解决这个问题的方式。但是这个解决方案的问题在于我认为它不是很有用,因为产品数量的增长将成为一场噩梦。我想知道如何改进这个解决方案。
我是python和Django的新手。我经常搜索,但找不到任何东西。
class Product(models.Model):
product_type = models.CharField(max_length=10, default=self.__class__.__name__, editable=False)
def getType(self):
return self.product_type
def __init__(self, *args, **kwargs):
models.Model.__init__(self, *args, **kwargs)
class Book(Product):
def __init__(self, *args, **kwargs):
Product.__init__(self, *args, **kwargs)
self.product_type == self.__class__.__name__
@login_required
def edit(request, product_id):
try:
product = Product.objects.get(pk=service_id)
except Product.DoesNotExist():
return HttpResponseNotFound()
if product.getType() == 'Ebook':
product = product.ebook
formObject = EbookForm
template = 'products/edit_ebook.html'
elif product.getType() == 'CD':
product = product.host
formObject = CdForm
template = 'products/edit_cd.html'
elif product.getType() == 'Dress':
formObject = DressForm
template = "products/edit_dress.html"
if request.method == 'POST':
form = formObject(request.POST, instance=product)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('product_index'))
else:
form = formObject(instance=product)
return render(request, template, {'form' : form })
答案 0 :(得分:1)
如果您将模板名称存储在模型中,则可以删除所有if
语句,因此您只需拨打render(request, product.template, {'form': form})
。
因此,您的CharField
模型上会有template
名为Product
的{{1}},您可以填写“预订'电子书”,等
这背后的原理被称为" replace conditional with polymorphism"。
您还应该考虑使用抽象基础模型,这样可以提高性能。