我需要在Django中使用自定义模型方法的帮助

我正在Django开发一个Web应用程序,以每周重复的方式管理杂事。 这些是我迄今为止提出的模型。 家务需要能够分配多个星期的日子和时间。 因此,洗衣的烦恼可能是周日@上午8:00和周三@ 5:30 pm。 我首先要确认下面的模型是表示这一点的最佳方式。 其次,我对模型关系和自定义模型方法有点困惑。 由于这些杂事是重复发生的,我需要能够检查本周是否有CompletedEvent。 由于这是行级别的功能,这将是一个模型方法是否正确? 根据以下模型,我将如何检查这个? 它让我挠了挠头。

models.py:

from django.db import models
from datetime import date

class ChoreManager(models.Manager):
    def by_day(self, day_name):
        return self.filter(scheduledday__day_name = day_name)

    def today(self):
        todays_day_name = date.today().strftime('%A')
        return self.filter(scheduledday__day_name = todays_day_name)

class Chore(models.Model):
    objects = ChoreManager()
    name = models.CharField(max_length=50)
    notes = models.TextField()

    class Meta:
        ordering = ['scheduledday__time']

class ScheduledDay(models.Model):
    day_name = models.CharField(max_length=8)
    time = models.TimeField()
    chore = models.ForeignKey('Chore')

class CompletedEvent(models.Model):
    date_completed = DateTimeField(auto_now_add=True)
    chore = models.ForeignKey('Chore')

然后,你需要做的是:

monday_of_week = some_date - datetime.timedetla(days=some_date.weekday())
end_of_week = date + datetime.timedelta(days=7)
chore = Chore.objects.get(name='The chore your looking for')

ScheduledDay.objects.filter(completed_date__gte=monday_of_week,
                            completed_date__lt=end_of_week,
                            chore=chore)

整洁(更快)的选项是使用位掩码!

想想你想要一个星期的日子作为一个二进制数重复 - 每一天一点点。 例如,如果您想在每周二,周五和周日重复一次繁琐的操作,那么您将得到二进制数字1010010(或十进制82):

S S F T W T M
1 0 1 0 0 1 0 = 1010010

为了说明起见,天数倒过来

并且要检查今天是否应该完成一项杂事,只需获得当天的电话号码并执行&

from datetime import datetime as dt

if dt.today().weekday() & 0b1010100:
    print("Do chores!")


楷模

你的models.py看起来有点像这样:

from django.contrib.auth.models import User
from django.db import models
from django.utils.functional import cached_property


class Chore(models.Model):
    name = models.CharField(max_length=128)
    notes = models.TextField()


class ChoreUser(models.Model):
    chore_detail = models.ForeignKey('ChoreDetail')
    user = models.ForeignKey('ChoreDetail') 

    completed_time = models.DateTimeField(null=True, blank=True)


class ChoreDetail(models.Model):
    chore = models.ForeignKey('Chore')
    chore_users = models.ManyToManyField('User', through=ChoreUser)

    time = models.DateTimeField()
    date_begin = models.DateField()
    date_end = models.DateField()
    schedule = models.IntegerField(help_text="Bitmask of Weekdays")

    @cached_property
    def happens_today(self):
        return bool(dt.today().weekday() & self.weekly_schedule)

该模式具有用户和家务日程安排之间的M2M关系。 所以你可以扩展你的想法,比如记录杂事的持续时间(如果你想),或者甚至有许多用户参与同一件杂事。


为了回答你的问题,如果你希望本周获得已完成活动的列表,可以将它放在ChoreUser的模型管理器中:

from datetime import datetime as dt, timedelta


week_start = dt.today() - timedelta(days=dt.weekday())
week_end = week_start + timedelta(days=6)

chore_users = ChoreUser.objects.filter(completed_time__range=(week_start, week_end))


现在,您可以在一次数据库调用中获得所有需要的信息:

user = chore_users[0].user
time = chore_users[0].chore_detail.time
name = chore_users[0].chore_detail.chore.name
happens_today = chore_users[0].chore_detail.happens_today

您还可以轻松地为用户完成所有完成的任务:

some_user.choreuser_set.filter(completed_time__range=(week_start, week_end))
链接地址: http://www.djcxy.com/p/56531.html

上一篇: I need help with a custom model method in Django

下一篇: Forbidden (CSRF token missing or incorrect.) Django how to solve?WITH MY CODE