如何组织项目以获得特定用户类型的产品价格?

时间:2016-05-19 07:09:01

标签: django

为了说明问题,我建议考虑我的应用程序的简化版本。

假设有一个产品型号:

# 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。

实施它的最佳方法是什么?我将不胜感激任何提示和帮助。

1 个答案:

答案 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 %}