【问题标题】:Django, unique time interval for the admin panelDjango,管理面板的唯一时间间隔
【发布时间】:2010-02-11 09:36:27
【问题描述】:

您好, 假设我有这样的模型:

class Foo(models.Model):
    type = models.ForeignKey(Type)
    start_time = models.DateTimeField()
    end_time models.DateTimeField()

对于每个具有相同类型的 Foo 对象,我需要这个时间间隔 (end_time - start_time) 是唯一的,这样就不可能创建具有冲突间隔的第二个 Foo。如何实现?

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    请参阅管理界面中有关 custom validation 的文档。

    基本上你必须创建自己的(模型)表单,比如说CustomFooAdminForm 并将其分配给管理模型:

    class FooAdmin(admin.ModelAdmin):
        form = CustomFooAdminForm
    

    你可以有类似的形式(见custom validation in forms):

    # more or less pseudo code
    class CustomFooAdminForm(forms.ModelForm):
    
        def clean(self):
            cleaned_data = super(CustomFooAdminForm, self).clean()
            interval = cleaned_data.get("end_time") - cleaned_data.get("start_time")
            type = cleaned_data.get("type")
    
            q = Foo.objects.extra(select={'interval':'time_end - time_start'}
            counter = q.filter(interval=intervak, type=type).count()
    
            if counter > 0:
                raise forms.ValidationError("ERROR!!!!")
    
            # Always return the full collection of cleaned data.
            return cleaned_data
    

    也许您必须先将 DateTimeFields 转换为 UNIX 时间戳,然后才能在 SQL 中减去它们(UNIX_TIMESTAMP(time_end) - UNIX_TIMESTAMP (time_start) 用于 MySQL)。或者您可以在 MySQL 中使用 DATEDIFF() 来获得差异。但请注意,如果您使用此类特殊功能(只要它们在同名的其他数据库中不可用),则您将应用程序绑定到某个数据库。

    【讨论】:

    • 非常感谢您的详细解释!对于最后一部分(tim 差异),我猜 timedelta 可以代替 unix 时间技巧有用(但不确定:))。
    猜你喜欢
    • 2020-07-24
    • 2011-04-08
    • 2021-09-27
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2016-09-10
    相关资源
    最近更新 更多