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

时间:2019-03-01 08:33:29

标签: python 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)

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

我将使用带有通行选项的ManyToManyField。 这样,您就可以存储有关Task和User之间的更多信息。

 <Appenders>
    <Console name="console-log" target="SYSTEM_OUT">
        <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
    </Console>
    <RollingFile name="error-log" fileName="${log-path}/admin-web-error.log"
                 filePattern="${log-path}/admin-web-error-%d{yyyy-MM-dd}.log">
        <PatternLayout>
            <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        </Policies>
    </RollingFile>
    <RollingFile name="activity-log" fileName="${log-path}/admin-web-activity-log.log"
                 filePattern="${log-path}/admin-web-activity-log-%d{yyyy-MM-dd}.log">
        <PatternLayout>
            <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        </Policies>
    </RollingFile>
</Appenders>

<Loggers>
    <Logger name="hms.apptizer.admin.controller" level="debug" additivity="false">
        <appender-ref ref="error-log" level="error"/>
        <appender-ref ref="console-log" level="debug"/>
        <appender-ref ref="activity-log" level="info"/>
    </Logger>
    <Root level="info" additivity="false">
        <AppenderRef ref="console-log"/>
    </Root>
</Loggers>

如果您喜欢:-)

,角色可能要复杂得多