Django-如何将每个“用户”的“反馈”分配给单个“分配”? (一对多)

时间:2019-02-16 16:02:55

标签: django django-models

我有三个模型:“用户”,“分配”和“反馈”。我试图设置一个可以由所有用户帐户访问/查看的OneToMany分配,然后可以在其中应用反馈,但只能由OneToOneField用户帐户查看。这里有一些代码可以帮助解释当前发生的情况。

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save

# Create your models here.
class UserProfile(models.Model):
USER_TYPE_CHOICES = (
    ('Student', 'Student'),
    ('Lecturer', 'Lecturer'),
    ('Admin', 'Admin'),
) 
user = models.OneToOneField(User, on_delete=models.CASCADE)
uni_id = models.IntegerField(default=0)
type_user = models.CharField(max_length=20, 
default='s',choices=USER_TYPE_CHOICES)
description = models.CharField(max_length=100, default='')
city = models.CharField(max_length=100, default='')
website = models.URLField(default='')
phone = models.IntegerField(default=0)
image = models.ImageField(upload_to='profile_image', blank=True)

def __str__(self):
    return self.user.username

def create_profile(sender, **kwargs):
if kwargs['created']:
    user_profile = 
UserProfile.objects.create(user=kwargs['instance'])

post_save.connect(create_profile, sender=User)


# Assignment model
class Assignment(models.Model):
assignment_title = models.CharField(max_length=256)
assignment_id = models.IntegerField(default=0)
user = models.ManyToOneField(User, on_delete=models.CASCADE)

# Feedback model
class Feedback(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)

我考虑过可能有一个外键将分配分配到反馈模型中的OneToOne字段,但是我不确定。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为您希望将反馈与特定的分配相关(可能有很多),因此在Feedback模型中需要分配外键。另外,您需要使用User作为外键,而不是一对一的关系,因为这会将您限制为每个用户一个反馈。

class Feedback(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    assignment = models.ForeignKey(Assignment, on_delete=models.CASCADE)

如果用户每次分配只能获得一个反馈,请在Feedback模型中指定此反馈:

    class Meta:
        unique_together = ('assignment', 'user')

用实际的反馈(等级,评论等)扩展Feedback模型,并可能为反馈的发起者添加一个字段。

然后,您可以创建一个仅显示request.user反馈的视图。 Django tutorialmany other helpful resources都提供了很多视图。

Assignment中,由于可以向多个学生分配作业,并且学生在学习过程中将获得多个作业,因此您需要与User建立多对多的关系:

users = ManyToManyField(User)

(顺便说一句,ManyToOneField不会是ForeignKey。)