【发布时间】: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