Запрос объектов, созданных в течение определенного периода времени - PullRequest
0 голосов
/ 21 января 2020

Я пишу запрос, который пытается получить список пользователей и возвращает их, если они были созданы в течение 30 дней (1 месяц).

вот что я пробовал,

models.py

class Showcase(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, related_name="Showcases")
    content = models.TextField(null=True)
    created_on = models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(max_length=255, unique=True)

serializers.py

class ShowcaseSerializer(serializers.ModelSerializer):
    user = serializers.SlugRelatedField(read_only=True, slug_field='slug')
    created_on = serializers.SerializerMethodField(read_only=True)
    slug = serializers.SlugField(read_only=True)

    class Meta:
        model = Showcase
        exclude = ['id']

    def get_created_on(self, instance):
        return instance.created_on.strftime("%d %B %Y ; %H:%M:%S %Z")

views.py

class MostLikedMonthShowcasesView(generics.ListAPIView):
    '''
    Most liked showcases created within the past month
    '''
    serializer_class = ShowcaseSerializer
    permission_classes = [AllowAny]

    def get_queryset(self):
        last_30_days = datetime.datetime.today() - datetime.timedelta(30)
        return Showcase.objects.filter(created_on__lte=datetime.datetime.today(), created_on__gt=datetime.datetime.today()-datetime.timedelta(days=30)).values('created_on')

когда я запускаю приведенный выше код, я получаю 'dict' object has no attribute 'created_on'

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Ваш код, который выдает эту ошибку, не является частью базы данных, держу пари, что это так:

def get_created_on(self, instance):
    return instance.created_on.strftime("%d %B %Y ; %H:%M:%S %Z")

Покажите, как ваш абонент для этого метода

Также используйте функцию диапазона :

https://docs.djangoproject.com/en/3.0/ref/models/querysets/#range

1 голос
/ 21 января 2020

Метод values ​​() возвращает QuerySet, содержащий словари. Итак, базовый набор запросов будет

 def get_queryset(self):
    last_30_days = datetime.datetime.today() - datetime.timedelta(30)
    return Showcase.objects.filter(created_on__range=[last_30_days,datetime.datetime.today())
...