将Django RestFramework中的create方法覆盖为POST数据

时间:2016-12-05 04:53:56

标签: python json django datetime

我目前正在使用Django RestFramework来创建使用GET和POST来检索/插入Django应用程序中的数据的API。我目前有一个名为TransactionDateTime的数据库模型,它有一个名为start_dt的字段(见下文),它采用DateTimeField。挑战在于我在我的json POST数据结构中传递一个字符串(见下文),我需要覆盖create方法以循环JSON结构以将字符串转换为适当的日期时间结构。我知道用于成功将字符串转换为datetime的逻辑,因为我能够在Django shell中执行它(见下文),但我不知道如何覆盖create方法并在其中编写相应的代码实现这一目标的create方法。请协助。下面是我的视图的副本,它通过GET成功返回JSON数据结构,在create方法中有一个大问题

来自models.py的TransactionDateTime模型

class TransactionDateTime(models.Model):
    room = models.ForeignKey(Room, on_delete = models.CASCADE)
    start_dt = models.DateTimeField('start_dateTime')
    end_dt = models.DateTimeField('end_dateTime', blank=True, null=True)


    def __str__(self):
        return str(self.start_dt)

POST上使用的数据结构

[
  {
    "start_dt": "2015-01-28 03:00:00"
  },

  {
    "start_dt": "2015-01-28 05:30:00"
  }
]

将字符串转换为日期时间的逻辑

from datetime import datetime
my_date = datetime.strptime('2015-01-28 05:30:00', '%Y-%m-%d %H:%M:%S')

Django Mixin和View

class DateTimeMixin(object):
    serializer_class = SimpleSerializer4
    permission_classes = (permissions.IsAuthenticated,)


class DateTimeViewSet(DateTimeMixin, generics.BulkModelViewSet):

    def get_queryset(self):

        num = self.kwargs['dt_rm']
        num2 = self.kwargs['id']

        r1 = Room.objects.get(id = num)

        s1 = Schedule.objects.get(pk=num2)
        u= self.request.user.pk
        usr = User.objects.get(pk=u)

        if(s1.user.username == usr.username):
            queryset = r1.transactiondatetime_set.all()
            return queryset
        else: raise Http404("User does not exist")



    def get_serializer_context(self):

        num = self.kwargs['id']
        s1 = Schedule.objects.get(pk=num)
        var = s1.user.username
        context = super(DateTimeViewSet, self).get_serializer_context()
        return {'request' : var}


    def created(self, request, *args, **kwargs):
    ???

1 个答案:

答案 0 :(得分:1)

我认为正确的方法不是编写自己的自定义创建方法,而是教你的序列化程序如何接受你使用的日期格式,例如。

class SimpleSerializer4(something_here):
    ...
    start_dt = serializers.DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=['%Y-%m-%d %H:%M:%S'])
    ...

然后,您需要做的就是向CreateModelMixin添加ViewSet,它应该有用,例如。

from rest_framework.mixins import CreateModelMixin
...
class DateTimeViewSet(DateTimeMixin, CreateModelMixin, generics.BulkModelViewSet):
...

DateTimeField上的文档here

有关扩展视图集here

的文档

我发现查看rest_framework本身的工作方式通常很有帮助,所以here is the link to the source on GitHub