【问题标题】:Want to Create a model object with the instance of Another object from single serializer: Django - Rest API - Generic Views想要使用来自单个序列化程序的另一个对象的实例创建模型对象:Django - Rest API - Generic Views
【发布时间】:2022-01-23 20:21:16
【问题描述】:

我有一个用户模型和一个教师模型,如下所示 必须先创建用户模型,然后创建教师模型,并将用户作为对象(ForeignKey)。

用户模型

class User(AbstractUser):
'''
Class to store details of Users

Attribs:
    username (str):User name.
    role_options (str): Options for role
    role (str):Whether "Admin" or "Teacher".
    email (str):User email id. 
    parent_id (obj):Self foreign key field to store creator id.
    staff (bool):If Staff
    admin (bool):If admin 
'''

username=models.CharField(
    max_length=100,default="Unknown",null=True,blank=True)
role_options = [
    ('Admin','Admin'),
    ('Teacher','Teacher'),
    ('Student','Student')
]
role = models.CharField(
    choices=role_options,max_length=40,
    null=True,blank=True)
email=models.EmailField(max_length=100,unique=True)
parent_id = models.ForeignKey(
    'self',related_name="parent_admin",
    on_delete=SET_NULL,null=True,blank=True)
staff = models.BooleanField(default=False,null=True)
admin = models.BooleanField(default=False,null=True)
USERNAME_FIELD='email'
REQUIRED_FIELDS=[]
objects=UserManager()

def get_username(self):
    return self.email

@property
def is_staff(self):
    return self.staff

@property
def is_admin(self):
    return self.admin

教师模式

class Teacher(models.Model):
"""
Class to store Teacher details.

Attribs:
    fullname (str): Fullname of Teacher.
    email (Obj): Email Id of Teacher
    address (str): Address of Teacher
    joining_date (str): School joining date
    qualification (str): Qualification of Teacher
"""

fullname=models.CharField(max_length=100,null=True,blank=True)
email=models.OneToOneField(
    User,related_name="Teacher",on_delete=CASCADE,null=True,blank=True)
address = models.CharField(
    max_length=200,default="Unknown",null=True,blank=True)
joining_date = models.DateField(
    null=True,default=timezone.now,blank=True)
qualification = models.CharField(max_length=40,null=True,blank=True)

我已经创建了一个用于创建用户的序列化程序,如下所示

class UserSerializer(serializers.ModelSerializer):
"""Serializer for creating user."""
class Meta:
    model = User
    fields = [
        'id',
        'email',
        'password',
        'role'
    ]

我想创建一个用户并使用它的实例来创建一个教师,同时来自同一个序列化程序。我该怎么做?

下面是我的 api 视图

class TeacherCreate(CreateAPIView):
""" View for Creating Teacher """

authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated,AdminOnly]
serializer_class = TeacherCreateSerilaizer

【问题讨论】:

    标签: django-rest-framework django-class-based-views django-serializer django-generic-views django-rest-viewsets


    【解决方案1】:

    首先你的模型设计不好。让我从那里开始。

    请参考 Django Auth 模型和模型字段和属性,您不需要指定任何这些管理员(那里有 is_admin)、电子邮件、员工(那里有 is_staff)、用户名字段

    型号:

    class User(AbstractUser):
        ADMIN = 'Admin'
        TEACHER = 'Teacher'
        STUDENT = 'Student'
        role_options = (
            (ADMIN, 'Admin'),
            (TEACHER, 'Teacher'),
            (STUDENT, 'Student')
        )
        role = models.CharField(choices=role_options, max_length=40, default=TEACHER)
        REQUIRED_FIELDS = ['first_name']
        USERNAME_FIELD = 'email'
        
    
    class Teacher(models.Model):
        qualification = models.CharField(max_length=120)
        user = models.OneToOneField(User, related_name='staff_info', on_delete=models.CASCADE)
        joining_date = models.DateField(null=True, default=timezone.now, blank=True)
    

    序列化器:

    class UserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = ('id', 'email', 'first_name', 'last_name', 'role', 'is_admin', 'is_staff') 
    
    
    class TeacherSerializer(serializers.ModelSerializer):
        user = UserSerializer()
        class Meta:
            model = Teacher
            fields = ('id', 'qualification', 'user', 'joining_date')
    

    观看次数:

    class TeacherAPIView(ModelViewSet):
         serializer_class = TeacherSerializer
         lookup_field = "id"
         permission_classes = (IsAuthenticated, )
    
         def get_queryset(self):
             return User.objects.filter(is_active=True)
    
     
    

    【讨论】:

    • 您可以使用它来创建、更新、列出、删除和检索操作。您还可以通过覆盖 create()、update()、retrieve()、list() 和 destroy() 方法来编写自定义请求
    • 感谢您的建议,获取请求正在运行,但在创建教师时,未创建用户帐户并且用户字段保持为空。请回答这个问题 - 有什么方法首先创建用户,然后使用它的实例来创建教师而不覆盖 create 函数? (使用嵌套序列化程序)
    • @ChristoJohnson 请评论您的请求 json。那只有我能给你答案
    猜你喜欢
    • 2021-12-04
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2011-01-24
    • 2019-03-16
    相关资源
    最近更新 更多