【发布时间】:2021-06-20 12:12:12
【问题描述】:
我有一个 SerializerMethodField 计算下一个执行日期,将小时数添加到上次执行时间
简化代码,有这个模型:
class Activity(BaseModel):
name = models.CharField(max_length=250)
last_execution = models.DateTimeField()
def __str__(self):
return self.name
class Meta:
ordering = ('name',)
为了在下一次执行时间发送到前端,我的Serializer中有这个SerializerMethodField()
class ActivitySerializer(serializers.ModelSerializer):
next_execution = serializers.SerializerMethodField('get_next_execution')
class Meta:
model = Activity
fields = ('id', 'name', 'last_execution', 'next_execution',)
def get_next_execution(self, data):
# last = ActivityExecute.objects.filter(activity_id=data.id).order_by('-executed_at').first()
# time = data.periodicity_type.time_in_hour
# if last:
# if data.equipment.hour_meter > -1:
# return last.executed_at + timedelta(hours=time - (data.equipment.hour_meter - last.hour_meter))
# return last.executed_at + timedelta(hours=time)
#
# return data.equipment.created_at + timedelta(hours=time)
return data.last_execution + timedelta(hours=24)
但是当我尝试像这样将计算字段添加到filterset_fields 时:
class ActivityViewSet(viewsets.ModelViewSet):
permission_classes = (IsAuthenticated,)
serializer_class = ActivitySerializer
filter_backends = (filters.DjangoFilterBackend,)
filterset_fields = {
'id': ['exact'],
'name': ['icontains', 'exact'],
'last_execution': ['exact'],
'next_execution': ['exact'],
}
def get_object(self):
return super(ActivityViewSet, self).get_object()
def get_queryset(self):
return Activity.objects.all()
我收到了这个错误:
'Meta.fields' must not contain non-model field names: next_execution
有没有办法将SerializerMethodField() 添加到filterset_fields?使用方法get_queryset 将使我在该计算字段(已注释)中的所有逻辑都被复制。该字段工作正常,问题只是前端使用查询参数过滤值。
【问题讨论】:
-
我认为你最好的选择是在 Activity 模型上创建一个属性,如果使用 django-property-filter 包,它也可以在序列化程序和过滤器中使用。
标签: python django django-rest-framework django-filter