process_responseの後にDjangoは応答を平坦化しますか?
私はこのモデルを持っています(簡略版):
class Ticket(models.Model):
uuid = UUIDField(primary_key = True)
is_active = models.BooleanField(default = False)
remains = models.IntegerField(default = 2)
def __unicode__(self):
return '%s' % (self.is_active)
およびミドルウェア (簡略化):
class TicketMiddleware(object):
def process_request(self, request):
# ...
try:
request.ticket = Ticket.objects.get(uuid_exact=request.GET['ticket'], is_active=True)
print '%s %d' % (request.ticket.is_active, request.ticket.remains)
# first case:
return HttpResponse(request.ticket)
# second case:
#return HttpResponse(request.ticket.is_active)
except Ticket.DoesNotExists:
return HttpResponseForbidden()
def process_response(self, request, response):
if request.ticket is not None and request.ticket.remains > 0:
request.ticket.remains -= 1
if request.ticket.remains == 0:
request.ticket.is_active = False
request.ticket.save()
return response
最初のケースでは、4 番目のリクエストで禁止ページを取得しました。
RESPONSE PRINT
1: True True 2
2: False True 1
3: False True 1
4: Forbidden
2 番目のケースでは、3 番目のリクエストで禁止ページを取得しました。
RESPONSE PRINT
1: True True 2
2: True True 1
3: Forbidden
そして、この2番目のケースは私が望む方法です。適切にフローするために、最初にモデルを文字列化する必要があるのはなぜですか? 私が誤解したことは何ですか?
django.VERSION = (1, 2, 3, 'final', 0)
編集
問題が見つかりました。実際のコードでは、django.contrib.auth.models.User に外部キーを使用し、関連するユーザーのユーザー名でチケット モデルをユニコーディングします。
class Ticket(models.Model):
# ...
user = models.ForeignKey(User)
def __unicode__(self):
# this works as expected
return u'%s' % (self.is_active)
# with this I have unexpected third step in first case
# but I dont understand why
#return u'%s %s' % (self.user.username, self.is_active)