Admin inline without relationship ForeignKey

Is it possible to manually specify a set of related objects to display in the inline line where the foreign key relationship does not exist?

# 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, )

I want my model administrator to Diarydisplay embedded models Sleepthat have start_timethe same day as Diary.day. The problem is that the model Sleepdoes not have from ForeignKeyto Diary(instead, this relationship is implied by the use of dates).

Using the above, Django immediately complains that

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

How can I show the corresponding instances Sleepas inline lines on the Diaryadmin page ?

+4
source share
2 answers

:

  • 2 , , : .
  • , , , () . , , , .

, , , . InlineAdmin - , , , " ", , .

... ModelForm. , formset ( ) , . InlineFormset InlineAdmin , , .

, , URL- , admin/base.html javascript.

+2

, Django ForeignKey ( ManyToManyField, OneToOneField). , , " " Diary.day Sleep.start_time, .. , Diary.day == Sleep.start_time.date()

Django ForiegnKey to_field, FK , id. , DateTimeField Sleep DateField Diary, DateTimeField . , a 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 - , , " ":

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. 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.

+4

Source: https://habr.com/ru/post/1679701/


All Articles