我目前正在使用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):
???
答案 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