- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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' 不得包含非模型字段名称:next_execution
有一种方法可以将 SerializerMethodField()
添加到 filterset_fields
中吗?使用方法 get_queryset
将使我在该计算字段(注释)中的所有逻辑都被复制。该字段工作正常,问题只是前端使用查询参数过滤值。
最佳答案
如果您可以将一个包添加到您的项目中,那么 django-property-filter 会很容易
只需将您的序列化程序代码转换为如下属性:
class Activity(BaseModel):
name = models.CharField(max_length=250)
last_execution = models.DateTimeField()
def __str__(self):
return self.name
class Meta:
ordering = ('name',)
@property
def next_execution(self):
# all your logic in comment can be pasted here
return self.last_execution + timedelta(hours=24)
从 serializer
中删除您的 SerializerMethodField()
和 def get_next_execution
但将其保留在字段列表中,此属性将列为字段还有
class ActivitySerializer(serializers.ModelSerializer):
class Meta:
model = Activity
fields = ('id', 'name', 'last_execution', 'next_execution',)
现在,在 View 中,从您的 ViewSet
中删除 filterset_fields
,我们将把它添加到 FilterSet
类中...
为您的 ViewSet
创建一个 FilterSet
from django_property_filter import PropertyFilterSet, PropertyDateFilter
class ActivityFilterSet(PropertyFilterSet):
next_execution = PropertyDateFilter(field_name='next_execution', lookup_expr='exact') # this is the @property that will be filtered as a DateFilter, you can change the variable name, just keep the `field_name` right
class Meta:
model = Activity
fields = { # here is the filterset_fields property
'id': ['exact'],
'name': ['icontains', 'exact'],
'last_execution': ['exact'],
}
然后,只需将这个 FilterSet
添加到您的 ViewSet
中,奇迹就会发生
class ActivityViewSet(viewsets.ModelViewSet):
permission_classes = (IsAuthenticated,)
serializer_class = ActivitySerializer
filter_backends = (filters.DjangoFilterBackend,)
filterset_class = ActivityFilterSet
def get_object(self):
return super(ActivityViewSet, self).get_object()
def get_queryset(self):
return Activity.objects.all()
关于python - Django Rest Framework 使用 filterset_fields 在 ViewSet 中过滤计算出的 SerializerMethodField(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66769946/
我有以下两个 Django 模型(针对此示例进行了简化)。 class Participant(models.Model): name = models.CharField() stu
我有两种模型,一种是盒子,一种是盒子评论: 类 BoxViewSet(viewsets.ModelViewSet): 查询集 = Box.objects.all() 权限类=已验证, 序列化器类 =
我有一个基本的 View 集: class UsersViewSet(viewsets.ModelViewSet): permission_classes = (OnlyStaff,)
我有一个 Django 模型 Donation我公开为一个 View 集。现在我想为第二个模型添加一个额外的 URL Shop其中 Donation 的相关实例可以通过参数 order_id 检索并且
在文档中有带有自定义 url 的方法示例: http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers class Sni
我正在开发一个具有一些社交功能的项目,需要让用户可以看到他个人资料的所有详细信息,但只能看到其他人个人资料的公开部分。 有没有办法在一个 ViewSet 中做到这一点? 这是我的模型示例: class
我仍在学习 Django,我想这对某些人来说可能很容易。我试图找出简单设置 API URL 的最佳方法(以便它们都显示在 api 根目录中,并且可以实际用于项目中——在我的例子中是 /api/).我正
我有一个 ViewSet 类,其方法如下: @action(methods=["get"], detail=True, url_path="foo") def foo(self, request: R
我一直在尝试使用django-filters但对象没有被过滤。此外,权限不适用于 partial_update View 我有一个 View 集,它具有基本操作,如 list()、retrieve()
我有一个 ModelViewSet在 Django 的 REST 框架中,它使我能够通过以下地址执行 POST 和 GET: api/v1/users 这些用户与评论表有反向关系,我希望能够通过 UR
我是 django 的新手,正在使用 django-rest-framework 构建 REST API。我已经编写了一些代码来检查用户是否提供了一些参数。但是对于很多 if 条件来说这非常难看,所以
我想做以下事情: 用我的模型 class User(models.Model): id = models.AutoField(primary_key=True) field1 = mode
如何在 Django rest 框架 ViewSet 中对不同的功能使用不同的身份验证? 我创建了一个 UserViewSet,它有两个功能: 1。 list(列出所有注册的用户,permission
在 Django Rest Framework ViewSet 中,我有一个被覆盖的 list() class TicketViewSet(mixins.ListModelMixin,
View 集很方便,因为我们可以做这样的事情并获得一个完全工作的序列化器: class StoreObjectViewSet(mixins.ListModelMixin, mixins.Retriev
有什么优势 View 集 , 模型 View 集 和 APIView . django-rest-framework 文档中没有说清楚,也没有说什么时候使用ViewSet、ModelViewSet和A
我有一个带有 Django REST framework API 的移动应用程序,我有很多 ModelViewSet 可以调用来检索数据。我有性能问题,因为我需要在用户登录后调用很多路由,我想保留 R
我是 Python 和 Django 新手。我创建了 ViewSet,如下所示: api/views.py class UserDetails(ViewSet): """ CREATE, SELECT
我有一个分页结果集,因此响应返回如下: { "count": 944, "next": "http://api.visitorlando.teeny/consumer/listings/?page=3
我是 Python 和 Django 新手。我创建了 ViewSet,如下所示: api/views.py class UserDetails(ViewSet): """ CREATE, SELECT
我是一名优秀的程序员,十分优秀!