2015-05-03 2 views
0

Мне нужно вычитать одно целое число другого и сохранить результат. Это своего рода способ оплаты. Никогда не делать это раньше, так что код ниже - его то, что я пытаюсь сделать, на мой взгляд:Выделите одно целое из другого и сохраните

def checkoutstatus(request, article_id): 
    if request.POST: 
     article = Article.objects.filter(id=article_id) 
     article.article_users.add(request.user) 

     balance = int(UserProfile.objects.filter(balance=user_balance)) 
     cost = int(Article.objects.filter(cost=article_cost)) 
     new_balance = balance - cost 

     article.save() 

Так я подключил User к Article модель первой. Тогда мне нужно вычитать Article модели поле article_cost от UserProfile модели (которая простирается User с ForeignKey) полями user_balance и сохранить результат обратно в user_balance ...

Как вы можете видеть выше коды, я попытался сделать вычитание, но как я могу сохранить результат обратно до user_balance?

Кроме того, мне нужен int конвертер, если оба поля в обеих моделях работают как IntegerField?

Мое приложение article:

from django.db import models 
from django.contrib.auth.models import User 
from django.db import models 

class Article(models.Model): 
    class Meta(): 
     db_table = 'article' 

    article_users = models.ManyToManyField(User) 
    article_title = models.CharField(max_length=200, blank=False, null=False) 
    article_content = models.IntegerField(choices=CONTENT_CHOICES, null=True, blank=True) 
    article_cost = models.IntegerField(default=0) 
    article_likes = models.IntegerField(default=0) 

Мое приложение userprofile:

import PIL 

from django.db import models 
from django.contrib.auth.models import User 
from PIL import Image 
from django.db import models 
from article.models import Article 

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    user_picture = models.ImageField(upload_to='users', blank=False, null=False, default='users/big-avatar.jpg') 
    user_balance = models.IntegerField(default=0) 

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u) [0]) 

Также я создал приложение orderstatus, что нужно, чтобы сохранить историю заказов в БД:

from django.db import models 
from django.contrib.auth.models import User 
from article.models import Article 

class OrderHistory(models.Model): 
    class Meta(): 
     db_table = 'order' 

    user = models.ForeignKey(User) 
    article = models.ForeignKey(Article) 
    purchase_date = models.DateTimeField(auto_now_add=True) 

И напишите для него представление (которое вы можете увидеть в начале этого почта):

from django.shortcuts import render, render_to_response, redirect, Http404 
from django.core.context_processors import csrf 
from django.contrib import auth 
from django.template import RequestContext 
import datetime 

from django.contrib.auth.models import User 
from article.models import Article 
from userprofile.models import UserProfile 

def checkoutstatus(request, article_id): 
    if request.POST: 
     article = Article.objects.filter(id=article_id) 
     article.article_users.add(request.user) 

     balance = int(UserProfile.objects.filter(balance=user_balance)) 
     cost = int(Article.objects.filter(cost=article_cost)) 
     new_balance = balance - cost 

     article.save() 
+2

Пожалуйста, предоставьте свой 'models.py', чтобы мы могли лучше понять область действия. Кроме того, откуда берется 'user_balance'? – Hybrid

+0

@Hybrid Сообщение обновлено. При условии, что все данные, которые могут вам помочь, я думаю ... –

+0

'user_balance' не предоставляется на ваш взгляд !! – Othman

ответ

2

С МВТ (Model View Template) точки зрения, изменение баланса в UserProfile должны быть обработаны в модели он самостоятельно не в представлении.

class UserProfile(models.Model): 

    ## fields 
    balance = models.IntegerField(default=0) 


    def withdraw(self, amount): 
     # you will need to check here if the 
     # balance is enough for this transaction or not 
     self.balance = self.balance - amount 


    def can_purchase_amount(self, amount): 
     return True if amount <= self.balance 

views.py

def checkoutstatus(request, article_id): 
    """ 
    Make the transaction 
    """ 
    user_profile = UserProfile.objects.get(user=request.user) 
    article = Article.objects.filter(id=article_id) 


    # check if the user can purhcase this 
    if user_profile.can_purchase_amount(article.article_cost): 
     # the user have enough balance to make this payment 
     user_profile.withdraw(article.article_cost) 
     user_profile.save() 

     # add the user to the article 
     article.article_users.add(request.user) 

     # other things like register order or log 

    else: 
     # no enough balance 

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

+0

Отман, наконец, я получил его работу ...))) Thx много. Кроме того, можете ли вы рассказать мне, как показать список всех пользователей, которые подключились к статье в шаблоне? Я попробовал '{{article.article_users.user.username}}' и ничего не получил ... Как мне кажется, мне нужно «за» цикл с чем-то? –

+1

Поскольку это 'ManyToManyField', вам действительно нужно будет проходить через пользователей. вы можете использовать имя поля '{% for a в article.article_users.all%}', которое будет проходить через пользователей, которые приобрели эту статью. – Othman

+0

читайте это https://docs.djangoproject.com/en/1.8/topics/db/examples/many_to_many/ – Othman

0

Один из способов сделать это, чтобы переписать checkoutstatus следующим образом:

def checkoutstatus(request, article_id): 
    if request.POST: 
     article = Article.objects.filter(id=article_id) 
     article.article_users.add(request.user) 

     balance = int(UserProfile.objects.filter(balance=user_balance)) 
     cost = int(Article.objects.filter(cost=article_cost)) 
     new_balance = balance - cost 

     profile_to_update = UserProfile.objects.get(user=request.user) 
     profile_to_update.user_balance = new_balance 
     profile_to_update.save() 

     article.save() 

Но это не стандартным способом. Отметьте ответ @ Отмана за лучшую идею реализации.

Смежные вопросы