Django rest框架基于当前用户ID/令牌获取数据

Django rest框架基于当前用户ID/令牌获取数据,django,django-rest-framework,Django,Django Rest Framework,在我的模型中,我有一个族表,用户可以在其中输入他们的族详细信息并存储他们的信息。但是如何基于当前用户ID获取/查询所有家庭成员 例如:userId=1添加了2个家庭成员,母亲和父亲。如何根据当前用户的用户ID查询得到这2个家庭成员 这是我的密码: 型号 class MyUser(AbstractUser): userId = models.AutoField(primary_key=True) gender = models.CharField(max_length=6, bla

在我的模型中,我有一个族表,用户可以在其中输入他们的族详细信息并存储他们的信息。但是如何基于当前用户ID获取/查询所有家庭成员

例如:userId=1添加了2个家庭成员,母亲和父亲。如何根据当前用户的用户ID查询得到这2个家庭成员

这是我的密码:

型号

class MyUser(AbstractUser):
    userId = models.AutoField(primary_key=True)
    gender = models.CharField(max_length=6, blank=True, null=True)
    nric = models.CharField(max_length=40, blank=True, null=True)
    birthday = models.DateField(blank=True, null=True)
    birthTime = models.TimeField(blank=True, null=True)

class Family(models.Model):
    userId = models.ForeignKey(MyUser)
    relationship = models.CharField(max_length=100)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    gender = models.CharField(max_length=6, blank=True, null=True)
class MyUserSerializer(serializers.ModelSerializer):
    valid_time_formats = ['%H:%M', '%I:%M%p', '%I:%M %p']
    birthTime = serializers.TimeField(format='%I:%M %p', input_formats=valid_time_formats, allow_null=True, required=False)

    class Meta:
        model = MyUser
        fields = ['userId', 'username', 'email', 'first_name', 'last_name', 'gender', 'nric', 'birthday', 'birthTime']
        read_only_fields = ('userId',)
        extra_kwargs = {"password": {"write_only": True}}

    def update(self, instance, validated_data):
        for attr, value in validated_data.items():
            if attr == 'password':
                instance.set_password(value)
            else:
                setattr(instance, attr, value)
        instance.save()
        return instance


class FamilySerializer(serializers.ModelSerializer):

    class Meta:
        model = Family
        fields = ('id', 'userId', 'first_name', 'last_name', 'gender', 'relationship')
class MyUserViewSet(viewsets.ModelViewSet):
    permission_classes = [AllowAny]
    queryset = MyUser.objects.all()
    serializer_class = MyUserSerializer
    filter_backends = (filters.SearchFilter,)
    search_fields = ('=userId', 'username', 'email', 'first_name', 'last_name')


class FamilyViewSet(viewsets.ModelViewSet):
    permission_classes = [AllowAny]
    queryset = Family.objects.all()
    serializer_class = FamilySerializer


def get_object(self, *args, **kwargs):
    return self.request.user

def perform_update(self, serializer):
    super(CurrentFamilyView, self).perform_update(serializer)
    user = serializer.instance
    if settings.SEND_ACTIVATION_EMAIL and not user.is_active:
        context = {'user': user}
        to = [MyUser(user)]
        email.ActivationEmail(self.request, context).send(to)
序列化程序

class MyUser(AbstractUser):
    userId = models.AutoField(primary_key=True)
    gender = models.CharField(max_length=6, blank=True, null=True)
    nric = models.CharField(max_length=40, blank=True, null=True)
    birthday = models.DateField(blank=True, null=True)
    birthTime = models.TimeField(blank=True, null=True)

class Family(models.Model):
    userId = models.ForeignKey(MyUser)
    relationship = models.CharField(max_length=100)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    gender = models.CharField(max_length=6, blank=True, null=True)
class MyUserSerializer(serializers.ModelSerializer):
    valid_time_formats = ['%H:%M', '%I:%M%p', '%I:%M %p']
    birthTime = serializers.TimeField(format='%I:%M %p', input_formats=valid_time_formats, allow_null=True, required=False)

    class Meta:
        model = MyUser
        fields = ['userId', 'username', 'email', 'first_name', 'last_name', 'gender', 'nric', 'birthday', 'birthTime']
        read_only_fields = ('userId',)
        extra_kwargs = {"password": {"write_only": True}}

    def update(self, instance, validated_data):
        for attr, value in validated_data.items():
            if attr == 'password':
                instance.set_password(value)
            else:
                setattr(instance, attr, value)
        instance.save()
        return instance


class FamilySerializer(serializers.ModelSerializer):

    class Meta:
        model = Family
        fields = ('id', 'userId', 'first_name', 'last_name', 'gender', 'relationship')
class MyUserViewSet(viewsets.ModelViewSet):
    permission_classes = [AllowAny]
    queryset = MyUser.objects.all()
    serializer_class = MyUserSerializer
    filter_backends = (filters.SearchFilter,)
    search_fields = ('=userId', 'username', 'email', 'first_name', 'last_name')


class FamilyViewSet(viewsets.ModelViewSet):
    permission_classes = [AllowAny]
    queryset = Family.objects.all()
    serializer_class = FamilySerializer


def get_object(self, *args, **kwargs):
    return self.request.user

def perform_update(self, serializer):
    super(CurrentFamilyView, self).perform_update(serializer)
    user = serializer.instance
    if settings.SEND_ACTIVATION_EMAIL and not user.is_active:
        context = {'user': user}
        to = [MyUser(user)]
        email.ActivationEmail(self.request, context).send(to)
视图

class MyUser(AbstractUser):
    userId = models.AutoField(primary_key=True)
    gender = models.CharField(max_length=6, blank=True, null=True)
    nric = models.CharField(max_length=40, blank=True, null=True)
    birthday = models.DateField(blank=True, null=True)
    birthTime = models.TimeField(blank=True, null=True)

class Family(models.Model):
    userId = models.ForeignKey(MyUser)
    relationship = models.CharField(max_length=100)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    gender = models.CharField(max_length=6, blank=True, null=True)
class MyUserSerializer(serializers.ModelSerializer):
    valid_time_formats = ['%H:%M', '%I:%M%p', '%I:%M %p']
    birthTime = serializers.TimeField(format='%I:%M %p', input_formats=valid_time_formats, allow_null=True, required=False)

    class Meta:
        model = MyUser
        fields = ['userId', 'username', 'email', 'first_name', 'last_name', 'gender', 'nric', 'birthday', 'birthTime']
        read_only_fields = ('userId',)
        extra_kwargs = {"password": {"write_only": True}}

    def update(self, instance, validated_data):
        for attr, value in validated_data.items():
            if attr == 'password':
                instance.set_password(value)
            else:
                setattr(instance, attr, value)
        instance.save()
        return instance


class FamilySerializer(serializers.ModelSerializer):

    class Meta:
        model = Family
        fields = ('id', 'userId', 'first_name', 'last_name', 'gender', 'relationship')
class MyUserViewSet(viewsets.ModelViewSet):
    permission_classes = [AllowAny]
    queryset = MyUser.objects.all()
    serializer_class = MyUserSerializer
    filter_backends = (filters.SearchFilter,)
    search_fields = ('=userId', 'username', 'email', 'first_name', 'last_name')


class FamilyViewSet(viewsets.ModelViewSet):
    permission_classes = [AllowAny]
    queryset = Family.objects.all()
    serializer_class = FamilySerializer


def get_object(self, *args, **kwargs):
    return self.request.user

def perform_update(self, serializer):
    super(CurrentFamilyView, self).perform_update(serializer)
    user = serializer.instance
    if settings.SEND_ACTIVATION_EMAIL and not user.is_active:
        context = {'user': user}
        to = [MyUser(user)]
        email.ActivationEmail(self.request, context).send(to)

有人能帮我获取当前用户的家庭吗?假设我们有一个id为1的用户

usr = MyUser.objects.get(id=1)
usr_famly = usr.family_set.values()

usr\u family
将拥有与id=1的
用户相关的所有家庭数据
假设我们有一个id=1的用户

usr = MyUser.objects.get(id=1)
usr_famly = usr.family_set.values()
usr\u family
将拥有与id=1的
用户相关的所有家庭数据

您可以尝试以下方法:

class Family(models.Model):
    userId = models.ForeignKey(MyUser, related_name='user_family')
    relationship = models.CharField(max_length=100)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    gender = models.CharField(max_length=6, blank=True, null=True)
序列化程序.py

class FamilySerializer(serializers.ModelSerializer):

    class Meta:
        model = Family
        fields = ('id', 'first_name', 'last_name', 'gender', 'relationship')


class MyUserSerializer(serializers.ModelSerializer):

    valid_time_formats = ['%H:%M', '%I:%M%p', '%I:%M %p']
    birthTime = serializers.TimeField(format='%I:%M %p', input_formats=valid_time_formats, allow_null=True, required=False)
    my_family = FamilySerializer(many=True, source='user_family')

    class Meta:
        model = MyUser
        fields = ('userId', 'username', 'email', 'first_name', 'last_name', 'gender', 'nric', 'birthday', 'birthTime', 'my_family')
        read_only_fields = ('userId',)
        extra_kwargs = {"password": {"write_only": True}}
MyUserSerializer
现在将显示
userid
相关的家庭成员。如果要获取当前用户家庭成员,则需要覆盖
get\u queryset
方法

您的视图.py

class MyUserViewSet(viewsets.ModelViewSet):

    serializer_class = MyUserSerializer
    get_queryset(self):
        return  MyUser.objects.get(id=self.request.user.id)
现在,视图将返回当前用户族成员

更新

class MyUser(AbstractUser):
    userId = models.AutoField(primary_key=True)
    gender = models.CharField(max_length=6, blank=True, null=True)
    nric = models.CharField(max_length=40, blank=True, null=True)
    birthday = models.DateField(blank=True, null=True)
    birthTime = models.TimeField(blank=True, null=True)

class Family(models.Model):
    userId = models.ForeignKey(MyUser)
    relationship = models.CharField(max_length=100)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    gender = models.CharField(max_length=6, blank=True, null=True)
class MyUserSerializer(serializers.ModelSerializer):
    valid_time_formats = ['%H:%M', '%I:%M%p', '%I:%M %p']
    birthTime = serializers.TimeField(format='%I:%M %p', input_formats=valid_time_formats, allow_null=True, required=False)

    class Meta:
        model = MyUser
        fields = ['userId', 'username', 'email', 'first_name', 'last_name', 'gender', 'nric', 'birthday', 'birthTime']
        read_only_fields = ('userId',)
        extra_kwargs = {"password": {"write_only": True}}

    def update(self, instance, validated_data):
        for attr, value in validated_data.items():
            if attr == 'password':
                instance.set_password(value)
            else:
                setattr(instance, attr, value)
        instance.save()
        return instance


class FamilySerializer(serializers.ModelSerializer):

    class Meta:
        model = Family
        fields = ('id', 'userId', 'first_name', 'last_name', 'gender', 'relationship')
class MyUserViewSet(viewsets.ModelViewSet):
    permission_classes = [AllowAny]
    queryset = MyUser.objects.all()
    serializer_class = MyUserSerializer
    filter_backends = (filters.SearchFilter,)
    search_fields = ('=userId', 'username', 'email', 'first_name', 'last_name')


class FamilyViewSet(viewsets.ModelViewSet):
    permission_classes = [AllowAny]
    queryset = Family.objects.all()
    serializer_class = FamilySerializer


def get_object(self, *args, **kwargs):
    return self.request.user

def perform_update(self, serializer):
    super(CurrentFamilyView, self).perform_update(serializer)
    user = serializer.instance
    if settings.SEND_ACTIVATION_EMAIL and not user.is_active:
        context = {'user': user}
        to = [MyUser(user)]
        email.ActivationEmail(self.request, context).send(to)
  • 系列
    模型中添加了
    相关名称
  • MyUserSerializer
  • 您可以尝试以下方法:

    class Family(models.Model):
        userId = models.ForeignKey(MyUser, related_name='user_family')
        relationship = models.CharField(max_length=100)
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
        gender = models.CharField(max_length=6, blank=True, null=True)
    
    序列化程序.py

    class FamilySerializer(serializers.ModelSerializer):
    
        class Meta:
            model = Family
            fields = ('id', 'first_name', 'last_name', 'gender', 'relationship')
    
    
    class MyUserSerializer(serializers.ModelSerializer):
    
        valid_time_formats = ['%H:%M', '%I:%M%p', '%I:%M %p']
        birthTime = serializers.TimeField(format='%I:%M %p', input_formats=valid_time_formats, allow_null=True, required=False)
        my_family = FamilySerializer(many=True, source='user_family')
    
        class Meta:
            model = MyUser
            fields = ('userId', 'username', 'email', 'first_name', 'last_name', 'gender', 'nric', 'birthday', 'birthTime', 'my_family')
            read_only_fields = ('userId',)
            extra_kwargs = {"password": {"write_only": True}}
    
    MyUserSerializer
    现在将显示
    userid
    相关的家庭成员。如果要获取当前用户家庭成员,则需要覆盖
    get\u queryset
    方法

    您的视图.py

    class MyUserViewSet(viewsets.ModelViewSet):
    
        serializer_class = MyUserSerializer
        get_queryset(self):
            return  MyUser.objects.get(id=self.request.user.id)
    
    现在,视图将返回当前用户族成员

    更新

    class MyUser(AbstractUser):
        userId = models.AutoField(primary_key=True)
        gender = models.CharField(max_length=6, blank=True, null=True)
        nric = models.CharField(max_length=40, blank=True, null=True)
        birthday = models.DateField(blank=True, null=True)
        birthTime = models.TimeField(blank=True, null=True)
    
    class Family(models.Model):
        userId = models.ForeignKey(MyUser)
        relationship = models.CharField(max_length=100)
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
        gender = models.CharField(max_length=6, blank=True, null=True)
    
    class MyUserSerializer(serializers.ModelSerializer):
        valid_time_formats = ['%H:%M', '%I:%M%p', '%I:%M %p']
        birthTime = serializers.TimeField(format='%I:%M %p', input_formats=valid_time_formats, allow_null=True, required=False)
    
        class Meta:
            model = MyUser
            fields = ['userId', 'username', 'email', 'first_name', 'last_name', 'gender', 'nric', 'birthday', 'birthTime']
            read_only_fields = ('userId',)
            extra_kwargs = {"password": {"write_only": True}}
    
        def update(self, instance, validated_data):
            for attr, value in validated_data.items():
                if attr == 'password':
                    instance.set_password(value)
                else:
                    setattr(instance, attr, value)
            instance.save()
            return instance
    
    
    class FamilySerializer(serializers.ModelSerializer):
    
        class Meta:
            model = Family
            fields = ('id', 'userId', 'first_name', 'last_name', 'gender', 'relationship')
    
    class MyUserViewSet(viewsets.ModelViewSet):
        permission_classes = [AllowAny]
        queryset = MyUser.objects.all()
        serializer_class = MyUserSerializer
        filter_backends = (filters.SearchFilter,)
        search_fields = ('=userId', 'username', 'email', 'first_name', 'last_name')
    
    
    class FamilyViewSet(viewsets.ModelViewSet):
        permission_classes = [AllowAny]
        queryset = Family.objects.all()
        serializer_class = FamilySerializer
    
    
    def get_object(self, *args, **kwargs):
        return self.request.user
    
    def perform_update(self, serializer):
        super(CurrentFamilyView, self).perform_update(serializer)
        user = serializer.instance
        if settings.SEND_ACTIVATION_EMAIL and not user.is_active:
            context = {'user': user}
            to = [MyUser(user)]
            email.ActivationEmail(self.request, context).send(to)
    
  • 系列
    模型中添加了
    相关名称
  • MyUserSerializer

  • 很高兴提供帮助:)啊,对不起,我在查看页面时出错,因为没有重复检查。我有几个问题,在家族序列化程序中,我是否删除userId?在views.py
    MyUserViewSet
    中,我使用id而不是userId?对于
    FamilySerializer
    ,您可以保留或删除
    userId
    ,但我认为没有必要保留
    userId
    。在
    MyUserViewSet
    中,使用
    userId
    pk
    而不是
    id
    。现在我遇到了这个错误
    “MyUser”对象没有属性“myu family”。
    我必须在MyUser模型中创建“myu family”字段吗?很抱歉给您带来这么多麻烦。如果您能给点时间学习DRF文档,那就更好了。你会从中学到很多。很高兴能帮上忙:)啊,对不起,我在查看页面时出错了,因为没有重复检查。我有几个问题,在家族序列化程序中,我是否删除userId?在views.py
    MyUserViewSet
    中,我使用id而不是userId?对于
    FamilySerializer
    ,您可以保留或删除
    userId
    ,但我认为没有必要保留
    userId
    。在
    MyUserViewSet
    中,使用
    userId
    pk
    而不是
    id
    。现在我遇到了这个错误
    “MyUser”对象没有属性“myu family”。
    我必须在MyUser模型中创建“myu family”字段吗?很抱歉给您带来这么多麻烦。如果您能给点时间学习DRF文档,那就更好了。你会从中学到很多。