Как исправить «модель используется как в промежуточной модели, но не имеет внешнего ключа к модели»? - PullRequest
0 голосов
/ 23 июня 2019

Сообщение об ошибке:

blogs.Permission: (fields.E336) The model is used as an intermediate model by 'blogs.Category.permission', but it does not have a foreign key to 'Category' or 'Permission'.

Я попытался добавить внешний ключ в категорию в разделе «Модель разрешений», ошибка все еще возникает.

models.py:

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=50)
    permission = models.ManyToManyField('Permission',
                                        related_name='category_permissions',
                                        through='Permission'
                                        )

    def __str__(self):
        return self.name


class Permission(models.Model):
    HIGH = 'High'
    MEDIUM = 'Medium'
    LOW = 'Low'
    CLASSIFICATION_CHOICES = [
        (HIGH, 'High'),
        (MEDIUM, 'Medium'),
        (LOW, 'Low')
    ]
    category_name = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='category_name')
    name = models.CharField(max_length=100)
    description = models.TextField()
    platform = models.CharField(
        max_length=10,
        choices=PLATFORM_CHOICES,
        default=BOTH,
    )
    classification = models.CharField(
        max_length=10,
        choices=CLASSIFICATION_CHOICES,
        default=LOW,
    )

    def __str__(self):
        return self.name


class MobileApp(models.Model):
    name = models.CharField(max_length=200)
    icon = models.ImageField(upload_to='app_icons', blank=True, null=True)
    platform = models.CharField(
        max_length=10,
        choices=PLATFORM_CHOICES,
        default=IOS,
    )
    category = models.ManyToManyField('Category')
    provider = models.CharField(max_length=200)
    identifier = models.CharField(max_length=200)
    permission = models.ManyToManyField(Permission,
                                        related_name='mobile_app_permission',
                                        )

    def __str__(self):
        return self.name

Я пытаюсь использовать аргумент «через», чтобы включить поле описания разрешения m2m для MobileApp и Category

1 Ответ

0 голосов
/ 23 июня 2019

Это все виды сломанных.

Очевидно, вы хотите, чтобы ваши многие-ко-многим находились между Category и MobileApp, с сквозной моделью в качестве Разрешения. Таким образом, в поле m2m необходимо указать, что:

class Category(models.Model):
    name = models.CharField(max_length=50)
    permission = models.ManyToManyField('MobileApp',
                                        related_name='category_permissions',
                                        through='Permission'
                                        )

Во-вторых, как гласит ошибка, в сквозной модели вам нужны внешние ключи для обеих сторон. Кроме того, вам нужно дать им разумные имена и связанные с ними имена. Итак:

class Permission(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='permissions')
    mobile_app = models.ForeignKey('MobileApp', on_delete=models.CASCADE, related_name='permissions')

Наконец, вам не нужно также указывать m2ms в другом направлении для категории разрешений или . Удалите поля category и permission из MobileApp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...