为了说明问题,我建议考虑我的应用程序的简化版本。
假设有一个产品型号:
# products/models.py
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=128)
retail_price = models.DecimalField(max_digits=8, decimal_places=2)
自定义用户模型:
# authentication/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class ClientType(models.Model):
name = models.CharField(max_length=128)
part_of_retail_price = models.DecimalField(max_digits=4, decimal_places=3)
class Client(AbstractUser): # custom user model
client_type = models.ForeignKey(ClientType)
我希望能够在模板中为特定类型的用户获得特价:
{% for product in products %}
{{ product.user_price }}
{% endfor %}
授权用户的价格等于product.retail_price和request.user.client_type.part_of_retail_price的产品,对于未经授权的product.retail_price。
实施它的最佳方法是什么?我将不胜感激任何提示和帮助。
答案 0 :(得分:0)
如果您一次只需要显示一个或几个Client
个实例的值,最简单的方法是使用{{ product.user_price|user_price }}
之类的模板过滤器,如@Selcuk在评论中所建议的那样。
如果您需要使用QuerySet
中的值(排序等),请使用管理器,annotate()
和ExpressionWrapper()
。
class ProductManager(models.Manager):
def for_user(self, user):
# Calculate the price here
user_price = user.user.client_type.part_of_retail_price
return self.annotate(user_price=ExpressionWrapper(
Value(user_price), output_field=FloatField()))
class Product(models.Model):
# ...
objects = ProductManager()
然后,在视图中加载Product QuerySet时,添加当前用户
products = Product.objects.all().for_user(request.user)
将user_price
添加到常规QuerySet中,您可以根据需要在模板中使用它。
{% for product in products %}
{{ product.user_price }}
{% endfor %}