django перечисляет все долги клиентов - PullRequest
0 голосов
/ 21 октября 2019

Я использую фреймворк django-rest. У меня есть список клиентов. (клиенты), и у меня есть таблица, в которую я добавляю долги клиентов.

Я хочу сделать отдельный экран запроса и перечислить долги всех клиентов. API / форма списка долгов

у клиента может быть несколько записей о долге. поэтому я хочу показать общую сумму задолженности, общую сумму полученной и оставшейся задолженности каждого клиента в одной строке.

Как я могу это сделать?

enter image description here enter image description here

Модель клиента

class Customer(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, default=0)
    created_userKey = models.UUIDField(editable=False, default=uuid.uuid4)
    customerKey = models.UUIDField(editable=False, unique=True, default=uuid.uuid4)
    customerName = models.CharField(max_length=20, blank=False)
    customerSurname = models.CharField(max_length=20, blank=False)
    customerIdentityNo = models.CharField(max_length=11, blank=False)  # , unique=True)
    customerGender = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
    customerPhone = models.CharField(max_length=12, blank=False)
    customerBirth = models.DateField(blank=True)
    customerDescription = models.TextField(blank=True, max_length=100)
    customerStatus = models.BooleanField(default=False, blank=True)
    createdDate = models.DateTimeField(editable=False)
    modifiedDate = models.DateTimeField(editable=False, null=True)
    modifiedByUser = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='modifiedBy')

Debt.py

class Debt(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, default=0,
                             blank=False) 
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, blank=False,
                                 related_name='customer') 
    debtKey = models.UUIDField(editable=False, default=uuid.uuid4,
                               blank=False)  
    createduserKey = models.UUIDField(editable=False,
                                      default=uuid.uuid4)
    totalDebt = models.DecimalField(max_digits=8, decimal_places=2)
    receivedAmount = models.DecimalField(max_digits=8, decimal_places=2)
    paymentDate = models.DateField(blank=True)
    description = models.CharField(max_length=100, blank=True)

    createdDate = models.DateTimeField(auto_now=True, editable=False)
    modifiedDate = models.DateTimeField(auto_now=True)

Views.py

class DebtListAPIView(ListAPIView):
    serializer_class = DebtCreateSerializer

    def get_queryset(self):
        result = Debt.objects.values('customer__customerKey').annotate(Sum('totalDebt'), Sum('receivedAmount'))
        return result

Сериализатор

class DebtCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Debt
        fields = [
            'id',
            'user',
            'customer',
            'debtKey',
            'createduserKey',
            'totalDebt',
            'receivedAmount',
            'paymentDate',
            'description',
            'createdDate'
        ]

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

у клиента более одного долга. o Как мы можем увидеть общую и оставшуюся задолженность клиента?

Таким образом, у клиента A есть 10 записей о задолженности. Как мы можем сделать общую и остаточную задолженность одной строкой?

id  customerName  customerKey  totalDebt  receivedAmount
1   joshn         84aa5d444d6  100        30
2   joshn         84aa5d444d6  95         20
3   max           32as5dd1d1d  60         40
4   william       8888888888a  800        150
5   william       8888888888a  65         15

Я хочу получить такой результат

результат:

id  customerName  customerKey  totalDebt  receivedAmount
1   joshn         84aa5d444d6  195        50
3   max           32as5dd1d1d  60         40
4   william       8888888888a  865        165
0 голосов
/ 21 октября 2019

Я думаю, что вы ищете альтернативу для sql GROUP BY с SUM(). Который в Django ORM является функцией .annotate().

Прежде всего, так как @daniel предложил хранить их как неправильные строки, я предлагаю использовать числовое поле (int, decimal, float)

from django.db.models import Sum

result=Debt.objects.values('customer__customerKey').annotate(Sum('totalDebt'),Sum('receivedAmount'))

Для реализации этого в ListApiView вам не нужен сериализатор. Вы можете переопределить метод get напрямую, поэтому ваше представление станет следующим:

class DebtListAPIView(ListAPIView):
    serializer_class = DebtCreateSerializer

    def get(self):
        result=Debt.objects.values('customer__customerKey').annotate(Sum('totalDebt'),Sum('receivedAmount'))
    return Response(result)

Это должно работать без вызова сериализатора. убедитесь, что у вас есть правильный импорт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...