Django поле "многие ко многим" не отображается в админке - унаследованная база данных

Я хочу показать поле "многие ко многим", которое было создано в nocodb на админ панели django. Поэтому схема базы данных была создана nocodb. Я хочу также редактировать базу данных с помощью django.

Поле many to many tags не отображается в админке django. Нет никакого сообщения об ошибке. Кто-нибудь может помочь?

Я использовал inspectdb для создания моделей и admin_generator для создания кода администратора для полей nocodb.

Я попробовал добавить столбец id в таблицу объединения. Я сделал его первичным ключом. Это не помогло.

=================================================

На следующем рисунке показано, что теги не отображаются на странице.

field not showing up

=================================================

Вот как это выглядит в nocodb.

This is how it looks in nocodb

=================================================

Вот таблицы в mysql. Вы можете видеть таблицу заметок, таблицу тегов и таблицу заметок-тегов.

tables

=================================================

Этот пост-тег many to many я создал в Django, и он работает.

enter image description here

=================================================

Далее следуют 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,)

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