Ошибка с отношением ManyToManyField в Django
Я создаю модель kanban django для своего проекта, но я уже перепробовал много вещей, я прочитал django.docs, но ничего не нашел.
ОШИБКИ: tasks_management.Account.projects: (fields.E339) 'AccountProjects.owner' не является внешним ключом к 'Project'. tasks_management.AccountProjects: (fields.E336) Модель используется как промежуточная модель для 'tasks_management.Account.projects', но у нее нет внешнего ключа к 'Account' или 'Project'.
from django.contrib.auth.models import User
from django.db import models
class Project(models.Model):
project_name = models.CharField(max_length=50)
def __str__(self):
return self.project_name
class Account(models.Model):
username = models.CharField(max_length=50)
email = models.EmailField(max_length=254)
password = models.CharField(max_length=30)
projects = models.ManyToManyField(
Project,
through='AccountProjects',
through_fields=('contributors', 'owner'),
blank=True
)
def __str__(self):
return self.username
class AccountProjects(models.Model):
owner = models.ForeignKey(Account, on_delete=models.CASCADE, related_name='owner_project')
contributors = models.ForeignKey(Account, on_delete=models.CASCADE, related_name='contributors_project')
#
# class Board(models.Model):
# project_name = models.ForeignKey(Project, on_delete=models.CASCADE)
#
# def __str__(self):
# return self.project_name.project_name
#
# class Column(models.Model):
# column_name = models.CharField(max_length=30)
# board_name = models.ForeignKey(Board, on_delete=models.CASCADE)
# order_position = models.IntegerField(default=1)
#
# def __str__(self):
# return self.column_name
#
# class Task(models.Model):
# task_name = models.CharField(max_length=50)
# description = models.TextField()
# creation_date = models.DateField(auto_created=True)
# updated_date = models.DateField(auto_now=True)
# column_name = models.ForeignKey(Column, on_delete=models.CASCADE)
#
# def __str__(self):
# return self.task_name
Я прочитал документацию, но ничего не нашел, требования к базе данных следующие:
Учетная запись не нуждается в проекте для инстанцирования проект нуждается в учетной записи для создания у проекта есть 1 владелец и несколько контрибьюторов
в проекте есть 1 доска доска имеет несколько столбцов задача имеет 1 столбец
Я думаю, что многие атрибуты/сущности ожидают наличия внешнего ключа для Project model, и именно это приводит к вашей ошибке. Возможно, вам, возможно, придется немного переосмыслить свои модели. Например, у проекта всегда будут владелец и участники, поэтому вы можете добавить эти атрибуты в модель проекта вместо учетной записи, и это поле "многие ко многим" также будет добавлено в проект (у проекта один владелец и много участников).
Затем, если вы хотите получить весь проект, в котором участвует один пользователь, вы могли бы использовать методы "get_related" для извлечения этого набора запросов.
Ошибки, с которыми вы сталкиваетесь, связаны с тем, как вы настроили модель AccountProjects
и модель ManyToManyField
в модели Account
. В частности, модель AccountProjects
должна иметь внешние ключи как для Account
, так и для Project
, чтобы служить промежуточной моделью для отношения "многие ко многим", но у вас нет внешнего ключа для Project
модель.
Для устранения неполадок необходимо выполнить следующие действия:
1. Убедитесь, что AccountProjects
имеет внешние ключи как для Account
, так и для Project
.
2. Исправьте through_fields
в ManyToManyField
, чтобы указать правильные поля в AccountProjects
модели.
from django.contrib.auth.models import User
from django.db import models
class Project(models.Model):
project_name = models.CharField(max_length=50)
owner = models.ForeignKey('Account', on_delete=models.CASCADE, related_name='owned_projects')
def __str__(self):
return self.project_name
class Account(models.Model):
username = models.CharField(max_length=50)
email = models.EmailField(max_length=254)
password = models.CharField(max_length=30)
projects = models.ManyToManyField(
Project,
through='AccountProjects',
through_fields=('contributors', 'project'),
blank=True
)
def __str__(self):
return self.username
class AccountProjects(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='project_accounts')
contributors = models.ForeignKey(Account, on_delete=models.CASCADE, related_name='contributing_projects')
owner = models.ForeignKey(Account, on_delete=models.CASCADE, related_name='owned_projects')
class Meta:
unique_together = ('project', 'contributors')