gpt4 book ai didi

django - 没有外键关系的内联管理

转载 作者:行者123 更新时间:2023-12-02 13:23:15 28 4
gpt4 key购买 nike

是否可以手动指定要在内联中显示的相关对象集,其中不存在外键关系?

# Parent
class Diary(models.Model):
day = models.DateField()
activities = models.TextField()

# Child
class Sleep(models.Model):
start_time = models.DateTimeField()
end_time = models.DateTimeField()

class SleepInline(admin.TabularInline):
model=Sleep
def get_queryset(self, request):
# Return all Sleep objects where start_time and end_time are within Diary.day
return Sleep.objects.filter(XXX)

class DiaryAdmin(admin.ModelAdmin):
inlines = (SleepInline, )

我希望我的 Diary 模型管理员能够显示 Sleep 模型的内联内容,这些模型的 start_time 等于 Diary 的同一天.day。问题在于 Sleep 模型没有到 DiaryForeignKey(相反,通过使用日期来隐式关系)。

使用上面的内容,Django 立即提示

<class 'records.admin.SleepInline'>: (admin.E202) 'records.Sleep' has no ForeignKey to 'records.Diary'.

如何在 Diary 管理页面上将相关 Sleep 实例显示为内联?

最佳答案

无法回避的事实是,Django 管理内联是围绕 ForeignKey 字段(或 ManyToManyFieldOneToOneField)构建的。但是,如果我理解您的目标,那就是避免管理 Diary.daySleep.start_time 字段之间的“日期完整性”,即外部数据中的冗余关键关系,当该关系真正由 Diary.day == Sleep.start_time.date() 定义时

Django ForiegnKey 字段有一个 to_field property允许 FK 对 id 之外的列进行索引。但是,由于 Sleep 中有一个 DateTimeFieldDiary 中有一个 DateField,因此我们需要将其拆分DateTimeField 向上。此外,ForeignKey 必须与关系的“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 完全符合您的期望,并且避免了“日期冗余”:

Django Admin: Diary

<小时/>

提前考虑一个更真实(且有问题)的用例,假设每个用户每天可以有 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暗示 future 的实现。

最后,https://pypi.python.org/pypi/django-composite-foreignkey乍一看很有趣,但并没有创建“真正的”复合外键,也不能与 Django 的管理一起使用。

关于django - 没有外键关系的内联管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44646643/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com