Django поле "многие ко многим" не отображается в админке - унаследованная база данных
Я хочу показать поле "многие ко многим", которое было создано в nocodb на админ панели django. Поэтому схема базы данных была создана nocodb. Я хочу также редактировать базу данных с помощью django.
Поле many to many tags не отображается в админке django. Нет никакого сообщения об ошибке. Кто-нибудь может помочь?
Я использовал inspectdb для создания моделей и admin_generator для создания кода администратора для полей nocodb.
Я попробовал добавить столбец id в таблицу объединения. Я сделал его первичным ключом. Это не помогло.
=================================================
На следующем рисунке показано, что теги не отображаются на странице.
=================================================
Вот как это выглядит в nocodb.
=================================================
Вот таблицы в mysql. Вы можете видеть таблицу заметок, таблицу тегов и таблицу заметок-тегов.
=================================================
Этот пост-тег many to many я создал в Django, и он работает.
=================================================
Далее следуют models.py и admin.py:
models.py
# =================================================
class Tagg(models.Model):
title = models.CharField(max_length=45, blank=True, null=True)
def __str__(self):
return str(self.id) + " - " + self.title
class Post(models.Model):
# Fields
created = models.DateTimeField(auto_now_add=True, editable=False)
last_updated = models.DateTimeField(auto_now=True, editable=False)
title = models.CharField(max_length=230)
body = models.TextField(max_length=32100, default=None, blank=True, null=True)
taggs = models.ManyToManyField(Tagg)
class Meta:
pass
def __str__(self):
return str(self.pk)
# =================================================
class Nc2BfwTag(models.Model):
title = models.CharField(max_length=45, blank=True, null=True)
created_at = models.DateTimeField(blank=True, null=True)
updated_at = models.DateTimeField(blank=True, null=True)
class Meta:
managed = False
db_table = 'nc_2bfw__tag'
def __str__(self):
return str(self.id) + " - " + self.title
class Nc2BfwNcM2MNc2BfwNoteNc2BfwTag(models.Model):
nc_2bfw_tag_c = models.OneToOneField('Nc2BfwTag', models.DO_NOTHING, db_column='nc_2bfw__tag_c_id', primary_key=True) # Field renamed because it contained more than one '_' in a row.
nc_2bfw_note_p = models.ForeignKey('Nc2BfwNote', models.DO_NOTHING, db_column='nc_2bfw__note_p_id') # Field renamed because it contained more than one '_' in a row.
class Meta:
managed = False
db_table = 'nc_2bfw___nc_m2m_nc_2bfw__note_nc_2bfw__tag'
unique_together = (('nc_2bfw_tag_c', 'nc_2bfw_note_p'),)
class Nc2BfwNote(models.Model):
title = models.CharField(max_length=45, blank=True, null=True)
tags = models.ManyToManyField(Nc2BfwTag, through="Nc2BfwNcM2MNc2BfwNoteNc2BfwTag", blank=True)
created_at = models.DateTimeField(auto_now_add=True, editable=False)
updated_at = models.DateTimeField(auto_now=True, editable=False)
body = models.CharField(max_length=45, blank=True, null=True)
class Meta:
managed = False
db_table = 'nc_2bfw__note'
# =================================================
====
# admin.py
# =================================================
from django.contrib import admin
from django import forms
from . import models
from django.utils.html import format_html
# old.. from django.core.urlresolvers import reverse
from django.urls import reverse
from django.http import HttpResponseRedirect
from django.template.response import TemplateResponse
# =================================================
from .models import Tagg, Post, Nc2BfwTag, Nc2BfwNcM2MNc2BfwNoteNc2BfwTag, Nc2BfwNote
@admin.register(Tagg)
class TaggAdmin(admin.ModelAdmin):
list_display = ('id', 'title')
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('id', 'created', 'last_updated', 'title', 'body')
# =================================================
# @admin.register(models.Nc2BfwTag)
class Nc2BfwTagAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'created_at', 'updated_at')
admin.site.register(models.Nc2BfwTag, Nc2BfwTagAdmin)
# @admin.register(Nc2BfwNcM2MNc2BfwNoteNc2BfwTag)
# class Nc2BfwNcM2MNc2BfwNoteNc2BfwTagAdmin(admin.ModelAdmin):
# list_display = ('nc_2bfw_tag_c', 'nc_2bfw_note_p')
# list_filter = ('nc_2bfw_tag_c', 'nc_2bfw_note_p')
@admin.register(Nc2BfwNote)
class Nc2BfwNoteAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'created_at', 'updated_at', 'body')
# =================================================
Админка Django не может отобразить поле ManyToManyField, если вы указали промежуточную модель, потому что промежуточная модель может потребовать больше информации (она может иметь больше полей, чем требуемые). Вы можете просмотреть документацию здесь: https://docs.djangoproject.com/en/3.2/ref/contrib/admin/#working-with-many-to-many-intermediary-models
Однако вы можете использовать встроенные модели администратора для редактирования значений этого поля.
class Nc2BfwNcM2MNc2BfwNoteNc2BfwTagAdminInline(admin.TabularInline):
model = Nc2BfwNcM2MNc2BfwNoteNc2BfwTag
extra = 1
@admin.register(Nc2BfwNote)
class Nc2BfwNoteAdmin(admin.ModelAdmin):
list_display = ('id', 'title', 'created_at', 'updated_at', 'body')
inlines = (Nc2BfwNcM2MNc2BfwNoteNc2BfwTagAdminInline,)