繁体   English   中英

如何在Django中设计多对多关系?

[英]How to design a many-to-many relation in Django?

我正在Django 1.11中开发一个Web应用程序,它包括:

  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)

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

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

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

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()

我将通过选项使用ManyToManyField。 这样,您便可以存储有关“任务”和“用户”之间的更多信息。

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)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)
    assigned_users = models.ManyToManyField(
        User, 
        through='Assignment',
        related_name='tasks'
        )

class Assignment(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    task = models.ForeignKey(Task, on_delete=models.CASCADE)
    contribution_note = models.TextField()
    role = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

如果您喜欢,角色可能会更复杂:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM