Как сделать расчеты на основе экземпляра имени модели Django? - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть две формы для двух разных категорий счетов. Я хочу сделать некоторые расчеты, основанные на том, какая категория сделала бронирование.

models.py

    class category1(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        name = models.CharField(max_length=100)
        contact = models.CharField(max_length=100)
        email = models.CharField(max_length=100)

        def __str__(self):
            return self.name

    class category2(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        name = models.CharField(max_length=100)
        contact = models.CharField(max_length=100)
        email = models.CharField(max_length=100)

        def __str__(self):
            return self.name

    class booking(models.Model):
        booked_by = models.CharField(max_length=100)
        amount = models.IntegerField()
        Total = models.IntegerField()

        def save(self, *args, **kwargs):
            if self.booked_by == category1:(NEED HELP OVER HERE, what query should I use)
                self.Total = self.amount * 2
            if self.booked_by == category2:(NEED HELP OVER HERE, what query should I use)
                self.Total = self.amount * 4
            super(booking,self).save()

forms.py

    class bookingform(ModelForm):
        class Meta:
            model = booking
            exclude = ('booked_by','Total')

view.py

    class bookings_create(LoginRequiredMixin,CreateView):
        login_url = 'Mel:user_login'
        form_class = bookingform
        template_name = 'Mel/bookings_form.html'

        def form_valid(self, form):
            form.instance.booked_by = self.request.user
            return super(bookings_create, self).form_valid(form)

Если бронирование сделано по категории1, сделайте некоторые расчеты. Если бронирование осуществляется по категории 2, сделайте некоторые расчеты.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Обе категории имеют одинаковые поля.Должна быть одна Category модель и использование Foreign Key отношений.

0 голосов
/ 08 сентября 2018

Если мы предположим, что User - стандартная модель пользователя django, то это можно сделать так:

def save(self, *args, **kwargs):
    if category1.objects.filter(user__username=self.booked_by).exists():
        self.Total = self.amount * 2
    if category2.objects.filter(user__username=self.booked_by).exists()
        self.Total = self.amount * 4
    super(booking,self).save()

Однако лучше определить booked_by как внешний ключ для User. В этом случае вы получите согласованность базы данных:

class booking(models.Model):
    booked_by = models.ForeignKey(User, on_delete=models.CASCADE)
    amount = models.IntegerField()
    Total = models.IntegerField()

    def save(self, *args, **kwargs):
        if category1.objects.filter(user=self.booked_by).exists():
            self.Total = self.amount * 2
        if category2.objects.filter(user=self.booked_by).exists()
            self.Total = self.amount * 4
        super(booking,self).save()


class bookings_create(LoginRequiredMixin,CreateView):
    login_url = 'Mel:user_login'
    form_class = bookingform
    template_name = 'Mel/bookings_form.html'

    def form_valid(self, form):
        form.instance.booked_by = User.objects.get(username=self.request.user)
        return super(bookings_create, self).form_valid(form)
...