【问题标题】:Django Rest Framework, Serializer Level FilterDjango Rest 框架,序列化器级别过滤器
【发布时间】:2021-07-29 16:31:34
【问题描述】:

我有两个模型,分别名为 Account 和 Story。在 Django 上的 models.Manager 的帮助下,我编写了一个检索过去 24 小时内发布的故事的方法。使用 Django,这种方法效果很好。问题是,当我使用 Django Rest Framework 创建序列化程序时,它会提取所有故事。为了防止这种情况,我写了一个名为get_image_file的方法,并在这里使用了我在models.Manager的帮助下写的方法,但是我无法解决问题。结果,我如何使用 Django Rest Framework 仅提取过去 24 年发布的故事,就像我在 Django 方面所做的那样?

序列化器.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)

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    一种方法是使用过滤器类。 与 Serializer 类非常相似。

    Custom Generic Filter

    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
    

    【讨论】:

    • 谢谢,但我无法以这种方式解决问题。我用另一种方法解决了。
    • 很高兴听到这个消息! @AdilHaydar。我展示的这种方式对我来说是最好的做法......它的工作方式就像序列化程序一样,您可以将过滤器类重新用于其他目的。
    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 2015-06-29
    • 2021-02-17
    • 2014-02-17
    • 2020-03-22
    • 2015-10-29
    • 2020-05-08
    • 2016-05-14
    相关资源
    最近更新 更多