2016-05-19 2 views
0

Um das Problem zu veranschaulichen, schlage ich vor, eine vereinfachte Version meiner Anwendung zu betrachten.Wie wird das Projekt organisiert, um den Produktpreis für einen bestimmten Benutzertyp zu erhalten?

Angenommen, es gibt ein Produktmodell:

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

und kundenspezifische Benutzermodell:

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

Ich möchte einen Sonderpreis für eine bestimmte Art von Benutzer in der Vorlage erhalten können:

{% for product in products %} 
    {{ product.user_price }} 
{% endfor %} 

Berechtigte Preis ist gleich dem Produkt von product.retail_price und request.user.client _type.part_of_retail_price, für unautorisierte nur product.retail_price.

Was ist der beste Weg, um es zu implementieren? Ich würde mich über Hinweise und Hilfe freuen.

+0

Eine Methode wäre, einen benutzerdefinierten Filter zu schreiben, die den Wert mit dem richtigen Faktor multipliziert. Sie können es dann in Ihrer Vorlage wie '{{product.user_price | user_price}}' verwenden – Selcuk

Antwort

0

Wenn Sie nur den Wert für die Anzeige einer oder mehrerer Client Instanzen gleichzeitig benötigen, verwenden Sie am einfachsten einen Vorlagenfilter wie {{ product.user_price|user_price }}, wie im Kommentar von @Selcuk vorgeschlagen.

Wenn Sie den Wert in einem QuerySet benötigen, um damit zu arbeiten (Sortieren usw.), dann verwenden Sie einen Manager zusammen mit annotate() und 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() 

Dann, wenn Sie das Produkt QuerySet aus Ihrer Sicht laden, fügen Sie den aktuellen Benutzer

products = Product.objects.all().for_user(request.user) 

die user_price zu einem regelmäßigen QuerySet hinzuzufügen, und Sie können es in Ihrer Vorlage verwenden, je nach Bedarf.

{% for product in products %} 
    {{ product.user_price }} 
{% endfor %} 
Verwandte Themen