Django Rest框架,序列化器级过滤器



我有两个名为Account和Story的模型。在Django上的models.Manager的帮助下,我编写了一个方法来检索过去24小时内发布的故事。在Django中,这个方法工作得非常好。问题是,当我用Django Rest框架创建序列化器时,它会拉出所有的故事。为了防止这种情况,我写了一个叫做get_image_file的方法,并在这里使用了我在models.Manager的帮助下写的方法,但是我无法解决这个问题。因此,我如何只拉过去24年发布的故事与Django Rest框架,就像我在Django方面做的那样?

serializers.py

from rest_framework import serializers
from ..models import Account, Story

class StorySerializer(serializers.ModelSerializer):
class Meta:
model = Story
fields = ['image_file']
def get_image_file(self, obj): 
#This method doesn't work. DRF pulls all the stories.
return obj.get_available_stories()
class AccountSerializer(serializers.ModelSerializer):

class Meta:
model = Account
fields = '__all__'

stories = StorySerializer(many=True)

models.py

from django.db import models
import datetime
def upload_to(instance, filename):
username = instance.account.username
return '%s/%s/%s' %('stories',username,filename)
def upload_pp(instance, filename):
return '%s/%s/%s' %('profile_photo', instance.username,filename)
class Account(models.Model):
username_pk = models.CharField(max_length=122)
username = models.CharField(max_length=55, unique=True)
profile_photo_id = models.CharField(max_length=155, unique=True)
profile_photo = models.ImageField(upload_to=upload_pp, null=True, blank=True)
profile_photo_width = models.IntegerField(null=True, blank=True)
profile_photo_height = models.IntegerField(null=True, blank=True)
def __str__(self):
return self.username

class StoryManager(models.Manager):
def get_available_stories(self, *args, **kwargs):
date_from = datetime.datetime.now() - datetime.timedelta(days=1)
return super(StoryManager, self).filter(image_timestamp__gte = date_from)
class Story(models.Model):
account = models.ForeignKey(to=Account, on_delete=models.CASCADE, related_name="stories")
image_file = models.ImageField(upload_to=upload_to, blank=True, null=True, editable=False)
image_url = models.URLField()
image_pk = models.CharField(max_length=60, null=True, blank=True, editable=False, unique=True)
image_timestamp = models.DateTimeField(null=True, blank=True)
image_width = models.IntegerField(null=True, blank=True)
image_height = models.IntegerField(null=True, blank=True)
objects = StoryManager()
def __str__(self):
return str(self.account)

一个方法就是使用Filters class。与Serializer类非常相似。

自定义通用过滤器

def filter_queryset(self, request, queryset, view):
# Override this method to do your filtering.
# Probably your BaseModel has some filed as created_at
# Assuming that is a Datetime object
return queryset.filter(created_at.hour__lte=24)
# You can even sort this values adding a .sort_by() after the filter

最新更新