Как сохранить OneToMany в Django Admin

Это мои модели

class Author(models.Model):
    full_name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.full_name

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, db_column='author_id',related_name='authors',null=True,blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

Моя настройка администратора

@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('id', 'full_name', 'created_at', 'updated_at')
    search_fields = ['full_name']
    ordering = ['-created_at']

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'author', 'created_at', 'updated_at')
    search_fields = ['title']
    list_filter = ['author__full_name']
    ordering = ['-created_at']

Я хочу создать страницу автора. Я могу выбрать несколько Book с помощью author_id = Null. И когда я сохраню страницу, она обновит author_id для всех выбранных Book

Пожалуйста, помогите мне

Вы можете использовать класс TabularInline (https://docs.djangoproject.com/en/5.0/ref/contrib/admin/#working-with-many-to-many-models). Он описан для отношения M2M, но может быть применен и для обратного внешнего ключа

class BookInline(admin.TabularInline):
    model = Author.authors.through  # to fix after change the related_name property
    extra = 0
    
    
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('id', 'full_name', 'created_at', 'updated_at')
    search_fields = ['full_name']
    ordering = ['-created_at']
    inlines = [
        BookInline,
    ]

Для справки, свойство related_name в ForeignKey - это имя свойства для доступа другого класса к данной модели, поэтому в вашем случае related_name модели Book должно быть books

Вернуться на верх