Django 管理内联是围绕ForeignKey
字段(或ManyToManyField
, OneToOneField
)构建的这一事实无法回避。但是,如果我理解您的目标,那就是避免必须管理您的Diary.day
和Sleep.start_time
字段之间的“日期完整性”,即当关系真正定义为时,外键关系中的冗余Diary.day == Sleep.start_time.date()
DjangoForiegnKey
字段有一个to_field 属性,允许 FK 索引除id
. 但是,由于您有 a DateTimeField
inSleep
和 a DateField
in Diary
,我们需要将其分开DateTimeField
。此外,aForeignKey
必须与关系的“1”一侧的独特事物相关。Diary.day
需要设置unique=True
。
在这种方法中,您的模型看起来像
from django.db import models
# Parent
class Diary(models.Model):
day = models.DateField(unique=True)
activities = models.TextField()
# Child
class Sleep(models.Model):
diary = models.ForeignKey(Diary, to_field='day', on_delete=models.CASCADE)
start_time = models.TimeField()
end_time = models.DateTimeField()
然后你admin.py
就是
from django.contrib import admin
from .models import Sleep, Diary
class SleepInline(admin.TabularInline):
model=Sleep
@admin.register(Diary)
class DiaryAdmin(admin.ModelAdmin):
inlines = (SleepInline, )
即使Sleep.start_time
不再有日期,Django Admin 也完全符合您的期望,并且避免了“日期冗余”:
考虑一个更真实(且有问题)的用例,假设每个用户每天可以拥有 1 份日记:
class Diary(models.Model):
user = models.ForeignKey(User)
day = models.DateField()
activities = models.TextField()
class Meta:
unique_together = ('user', 'day')
一个人想写类似的东西
class Sleep(models.Model):
diary = models.ForeignKey(Diary, to_fields=['user', 'day'], on_delete=models.CASCADE)
但是,Django 1.11 中没有这样的功能,我也找不到任何关于添加它的严肃讨论。在 Postgres 和其他 SQL DBMS 中当然允许复合外键。我从 Django 源代码中得到了他们保持选项开放的印象:https ://github.com/django/django/blob/stable/1.11.x/django/db/models/fields/related.py#L621提示在未来的实施中。
最后,https: //pypi.python.org/pypi/django-composite-foreignkey 起初看起来很有趣,但它不能创建“真正的”复合外键,也不能与 Django 的管理员一起使用。