Ошибка с отношением 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')
Вернуться на верх