[英]How to design a many-to-many relation in Django?
我正在Django 1.11中开发一个Web应用程序,它包括:
这是我的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.