【问题标题】:Django rest framework get data based on current userId/tokenDjango rest框架根据当前userId/token获取数据
【发布时间】:2018-01-03 08:07:06
【问题描述】:

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

例如:userId=1 添加了 2 个家庭成员,母亲和父亲。如何根据当前用户的 userId 查询得到这 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)

谁能帮我获取当前用户的家人

【问题讨论】:

    标签: django django-rest-framework


    【解决方案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)
    

    serializers.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_queryset 方法。

    您的views.py

    class MyUserViewSet(viewsets.ModelViewSet):
    
        serializer_class = MyUserSerializer
        get_queryset(self):
            return  MyUser.objects.get(id=self.request.user.id)
    

    现在视图将返回当前用户的家庭成员。

    更新

    1. Family 模型中添加了related_name
    2. MyUserSerializer 中添加了source

    【讨论】:

    • 很高兴为您提供帮助:)
    • 对不起,由于没有仔细检查,我在查看页面时出错。我有几个问题,在家庭序列化程序中,我要删除 userId 吗?在 views.py MyUserViewSet 中,我使用 id 而不是 userId ?
    • 对于FamilySerializer,您可以保留或删除userId,但我认为没有必要保留userId。在MyUserViewSet 中使用userIdpk 而不是id
    • 现在我收到了这个错误'MyUser' object has no attribute 'my_family'. 我必须在 MyUser 模型中创建“my_family”字段吗?很抱歉给您带来了这些麻烦
    • 如果你给点时间学习一下 DRF doc 会更好。你会从中学到很多东西。
    【解决方案2】:

    假设我们有一个 id=1

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

    usr_famly 将拥有与user with id=1 相关的所有家庭数据

    【讨论】:

      猜你喜欢
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 2021-05-26
      • 1970-01-01
      • 2022-01-28
      • 2017-04-07
      • 2017-06-23
      相关资源
      最近更新 更多