我需要在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