首页 > 解决方案 > 如何在 Django 中设计多对多关系?

问题描述

我正在 Django 1.11 中开发一个 webapp,它包括:

  1. 用户可以添加任务并将其分配给其他用户。
  2. 用户应该能够看到分配给他并由他创建的任务。

这是我的models.py

from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    username = None
    email = models.EmailField(unique=True)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']

class Task(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField(max_length=500)

我应该如何将我的任务模型与用户模型联系起来?我应该将多对多字段放在用户模型还是任务模型中?我该怎么做呢?

编辑:可以为用户分配一项或多项任务。但是不能将相同的任务分配给其他用户。我想这是一个 OneToMany 关系。你对此有何看法?

标签: pythondjango

解决方案


对于您的情况,您可以使用如下关系

from django.db.models import Q
from django.db import models

class User(AbstractUser):
    username = None
    email = models.EmailField(unique=True)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']

    def get_tasks(self):
        return Task.objects.filter(
            Q(created_by=self) | Q(assignee=self)

class Task(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField(max_length=500)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)
    assignee = models.ManyToMany(User)

# how to use it

user = User.objects.get(pk=5)
tasks = user.get_tasks()

推荐阅读