我使用什么模型对象类型在Django Admin中存储时间值?

我使用什么模型对象类型在Django Admin中存储时间值?,django,datetime,django-models,Django,Datetime,Django Models,我正在尝试设置一个与时间长度相对应的产品(报纸订阅) 我让客户使用Django管理员添加产品类型(不同的订阅长度),但我找不到任何关于我应该使用什么模型对象类型来存储时间值的信息(比如52周、26周、1周等等)。我希望能够选择一个长度为天或周,因为有些报纸是周刊,有些是日报 现在我的产品型号是: class Product(models.Model): product_type = models.CharField(max_length=100) product_descript

我正在尝试设置一个与时间长度相对应的产品(报纸订阅)

我让客户使用Django管理员添加产品类型(不同的订阅长度),但我找不到任何关于我应该使用什么模型对象类型来存储时间值的信息(比如52周、26周、1周等等)。我希望能够选择一个长度为天或周,因为有些报纸是周刊,有些是日报

现在我的产品型号是:

class Product(models.Model):
    product_type = models.CharField(max_length=100)
    product_description = models.CharField(max_length=255)
    product_cost = models.DecimalField(decimal_places=2, max_digits=4)
    product_active = models.BooleanField()
    def get_absolute_url(self):
        return "/signup/%i/" % self.id
    def __unicode__(self):
        return self.product_type
有没有办法让产品类型成为一种可以让用户定义时间值的对象类型

谢谢


Anthony

我认为只存储两个值会更容易,一个数值和一个数字代表的选项

duration = models.IntegerField()
duration_type = models.CharField(max_length=32, choices=[
    ("day", "Days"),
    ("week", "Weeks")])
假设您有一个单独的订阅模型,那么您可以通过以下方法计算该模型中的过期时间:

class Subscription(models.Model):
    product = models.ForeignKey(Product)
    starts = models.DateField()
    def expires(self):
        from datetime import timedelta
        if self.product.duration_type == "day":
            days = self.product.duration
        elif self.product.duration_type == "week":
            days = self.product.duration * 7
        return self.starts + timedelta(days=days)

我认为只存储两个值会更容易,一个数值和一个数字代表的选项

duration = models.IntegerField()
duration_type = models.CharField(max_length=32, choices=[
    ("day", "Days"),
    ("week", "Weeks")])
假设您有一个单独的订阅模型,那么您可以通过以下方法计算该模型中的过期时间:

class Subscription(models.Model):
    product = models.ForeignKey(Product)
    starts = models.DateField()
    def expires(self):
        from datetime import timedelta
        if self.product.duration_type == "day":
            days = self.product.duration
        elif self.product.duration_type == "week":
            days = self.product.duration * 7
        return self.starts + timedelta(days=days)

您可以添加一些DateTime模型字段来描述订阅的开始和结束。您可以创建一个模型方法,通过从另一个日期时间中减去一个日期时间来返回timedelta

class Product(models.Model):
    product_type = models.CharField(max_length=100)
    product_description = models.CharField(max_length=255)
    product_cost = models.DecimalField(decimal_places=2, max_digits=4)
    product_active = models.BooleanField()

    subscription_start = models.DateTimeField()
    subscription_end = models.DateTimeField()

    def get_duration(self):
        # returns a timedelta
        return self.subscription_end - self.subscription_start

    def get_absolute_url(self):
        return "/signup/%i/" % self.id
    def __unicode__(self):
        return self.product_type
例如:


您可以使用该时间增量在视图中进行计算

您可以添加一些描述订阅开始和结束的日期时间模型字段。您可以创建一个模型方法,通过从另一个日期时间中减去一个日期时间来返回timedelta

class Product(models.Model):
    product_type = models.CharField(max_length=100)
    product_description = models.CharField(max_length=255)
    product_cost = models.DecimalField(decimal_places=2, max_digits=4)
    product_active = models.BooleanField()

    subscription_start = models.DateTimeField()
    subscription_end = models.DateTimeField()

    def get_duration(self):
        # returns a timedelta
        return self.subscription_end - self.subscription_start

    def get_absolute_url(self):
        return "/signup/%i/" % self.id
    def __unicode__(self):
        return self.product_type
例如:


您可以使用该时间增量在视图中进行计算

以确保我对您的理解是正确的,这两行代码:subscription\u start=models.DateTimeField()subscription\u end=models.DateTimeField()很抱歉重复此响应,但是。。。为了确保我对您的理解是正确的,这两行:“subscription\u start=models.DateTimeField()”subscription\u end=models.DateTimeField()”这些行在Django管理员中是否会显示为日历和时间工具,允许管理员选择特定的日期和时间?我需要给管理员一种方法来选择与用户注册日期时间字段相关的时间长度,这是一个变量。为了澄清,是的,这将在管理表单中创建一个开始日期选择器,一个结束日期选择器,使用nice Django表单元素。保存时,可以将数据检索为2个日期时间,例如
product.subscription\u start
或timedelta,例如
product.get\u duration()
访问timedelta对象意味着您可以在查看阶段以任何方式输出它,保持模型关于数据和视图关于表示。例如
>>>从datetime导入timedelta>>d=timedelta(days=1)>>>(d.days,d.seconds,d.microseconds)
为了确保我对您的理解是正确的,这两行代码是:subscription\u start=models.DateTimeField()subscription\u end=models.DateTimeField()抱歉重复此响应,但是。。。为了确保我对您的理解是正确的,这两行:“subscription\u start=models.DateTimeField()”subscription\u end=models.DateTimeField()”这些行在Django管理员中是否会显示为日历和时间工具,允许管理员选择特定的日期和时间?我需要给管理员一种方法来选择与用户注册日期时间字段相关的时间长度,这是一个变量。为了澄清,是的,这将在管理表单中创建一个开始日期选择器,一个结束日期选择器,使用nice Django表单元素。保存时,可以将数据检索为2个日期时间,例如
product.subscription\u start
或timedelta,例如
product.get\u duration()
访问timedelta对象意味着您可以在查看阶段以任何方式输出它,保持模型关于数据和视图关于表示。例如
>>>从datetime导入timedelta>>d=timedelta(days=1)>>>(d.days,d.seconds,d.microseconds)
因此在本例中,duration对象只存储一个数字。在Django管理员中,您只会看到一个数字框。然后duration_类型的对象将存储一个字符串,管理员只有两个选择。一旦我达到这一点,我将如何计算订阅何时过期?你能计算数字和日期吗?我存储在duration_类型中的字符串如何用于与datetimeField交互?我不确定您的数据模型是否正确,但如果您有一个单独的订阅,负责特定产品购买的开始/结束,您可以将过期日期作为订阅的一种方法来计算;请看我的编辑。谢谢AdamKG,我会把它插上,让你知道它是如何工作的。对于Django,我发现这个主题令人惊讶地很少,所以我真的很感激这个线索。所以在这个例子中,duration对象只存储一个数字。在Django管理员中,您只会看到一个数字框。然后duration_类型的对象将存储一个字符串,管理员只有两个选择。一旦我达到这一点,我将如何计算订阅何时过期?你能计算数字和日期吗?我存储在duration_类型中的字符串如何用于与datetimeField交互?我不确定您的数据模型是否正确,但如果您有一个单独的订阅,负责特定产品购买的开始/结束,您可以将过期日期作为订阅的一种方法来计算;请看我的编辑。谢谢AdamKG,我会把它插上,让你知道它是如何工作的。对于Django来说,我发现这个话题出人意料的少,所以我真的很感谢这个线索。