1
내 프로젝트에 API가 있고 응답 가능한 일부 데이터를 만들어야합니다. 이 경우에 대한Django Rest Framework i18n은 GET에서 작동하지만 POST에서는 작동하지 않습니다.
class Ticket(models.Model):
NEW = 'new'
CONFIRMED = 'confirmed'
USED = 'used'
CANCELED = 'canceled'
STATUS_CHOICES = (
(NEW, _('New')),
(CONFIRMED, _('Confirmed')),
(USED, _('Used')),
(CANCELED, _('Canceled')),
)
service_subscription = models.ForeignKey(ServiceSubscription)
price = models.DecimalField(max_digits=11, decimal_places=2, null=True, blank=True)
ticket_order = models.ForeignKey(TicketOrder)
begin_stamp = models.DateTimeField()
status = models.CharField(max_length=15, choices=STATUS_CHOICES, default=NEW)
code = models.CharField(max_length=36, null=True, blank=True)
created = models.DateTimeField(default=timezone.now)
changed = models.DateTimeField(auto_now=timezone.now)
processed_by = models.ForeignKey(User, on_delete=models.PROTECT, null=True, blank=True)
시리얼 :
그래서 나는 모델이
class TicketViewSetSerializer(serializers.ModelSerializer):
status = serializers.SerializerMethodField()
class Meta:
model = Ticket
fields = ('begin_stamp', 'status', 'changed')
def get_status(self, obj):
return obj.get_status_display()
내가 전화를 어디 뷰셋 한이 :
class TicketViewSet(viewsets.ModelViewSet):
queryset = Ticket.objects.all()
serializer_class = TicketViewSetSerializer
permission_classes = (IsAuthenticated, IsCorpMember)
@list_route(methods=['get', 'post'], url_path='check/(?P<event_schedule_pk>[0-9]+)')
def check_ticket(self, request, event_schedule_pk, *args, **kwargs):
event_schedule = get_object_or_404(EventSchedule, pk=event_schedule_pk)
data = {}
status = 200
if request.method == "POST":
# get ticket code
code = request.data.get('code')
try:
ticket = self.queryset.select_for_update().filter(
code=code, begin_stamp=event_schedule.start, service_subscription__data__jcontains={'id': event_schedule.event_id})[0]
except IndexError:
return HttpResponseNotFound(ugettext('Code invalid or ticket is not for this event'))
if ticket.status == 'confirmed':
ticket.status = 'used'
ticket.processed_by = request.user
ticket.save()
else:
status_msg = {
'new': ugettext('Need to be paid firstly'),
'used': ugettext(u'Already used'),
'canceled': ugettext('Ticket is canceled')
}
data['message'] = status_msg.get(ticket.status)
status = 400
ticket_serializer = TicketViewSetSerializer(ticket)
data['ticket'] = ticket_serializer.data
event_schedule_serializer = EventScheduleCorpSerializer(event_schedule)
data['event_schedule'] = event_schedule_serializer.data
return Response(data, status=status)
와 urls.py
의를router = routers.DefaultRouter()
router.register(r'ticket', views.TicketViewSet)
헤더에서 사용자 언어에 따라 티켓 상태를 변환해야합니다. 이 뷰셋을 GET (/ ticket /)에서 호출하면 상태가 변환되지만 POST 호출시 기본 언어로 데이터가 표시됩니다. (내 미들웨어 클래스에서 django.middleware.locale 가져 오기 LocaleMiddleware를 가지고 있습니다)
그래서 나는 정말로 내가 뭘 잘못하고 있는지 모른다.