【问题标题】:Django RestAPI 500 error when trying to GET a list of records尝试获取记录列表时出现 Django Rest API 500 错误
【发布时间】:2021-01-25 02:22:06
【问题描述】:

我想要实现的目标:获取所有链接的简单列表对于登录用户 - 使用此端点:http://127.0.0.1:8000/api/affypartnerlinks/

列表应该 包括 USERaffylinks 模型表中的所有字段(包括键)以及 USERaffiliates 表中的关联 site_name - 但仅适用于当前登录的用户。

卷曲测试

curl -X GET http://127.0.0.1:8000/api/affypartnerlinks/ -H 'Authorization: Token afdf84a95d53e15aea484b011fd3c754b165c1f2'

这是我遇到的错误。

500 错误: AttributeError:尝试在序列化程序 USERaffylinksSerializer 上获取字段 owner_link_useraffyid 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 USERaffiliates 实例上的任何属性或键都不匹配。 原始异常文本为:“USERaffiliates”对象没有属性“owner_link_useraffyid”。

--- 谢谢 :)

VIEWS.py

@action(methods=['POST','GET',], detail=True)
class AffyPartnerLinksViewSet(viewsets.ModelViewSet):
    queryset= USERaffylinks.objects.all()  #need to filter on login user > owneruserid=request.user.id
    serializer_class = USERaffylinksSerializer
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated, )
  
    def get_queryset(self):
        #restrict to current logged in  user
        user = self.request.user
        return USERaffiliates.objects.filter(owneruserid=user)

序列化器.py

class USERaffylinksSerializer(serializers.ModelSerializer):
    class Meta:
        model = USERaffylinks
        fields = '__all__'
        extra_fields = ['site_name']        #from USERaffiliates table
        extra_kwargs = {
            'owneruserid': {'required':True},
            'owner_link_useraffyid': {'required':True}
        }

    def get_field_names(self, declared_fields, info):
        expanded_fields = super(USERaffylinksSerializer, self).get_field_names(declared_fields, info)

        if getattr(self.Meta, 'extra_fields', None):
            return expanded_fields + self.Meta.extra_fields
        else:
            return expanded_fields

模型.py


class USERaffylinks(models.Model):
    owner_link_useraffyid = models.ForeignKey(USERaffiliates, on_delete=models.CASCADE) #link(s) for each partner stores the  id from USERaffiliates
    owneruserid = models.ForeignKey(User, on_delete=models.CASCADE, default=0) #added to make the model easier to access link data when we only have userID

    ...
    ...

    def site_name(self):
        return self.owner_link_useraffyid.site_name   



class USERaffiliates(models.Model):
    owneruserid = models.ForeignKey(User, on_delete=models.CASCADE, default=1) #if no registered user admin owns = 1
    user_category = models.BigIntegerField(null=True, default=None, blank=True ) #id key from USERcategories
    registered_email = models.EmailField(null=True, default=None, blank=True)
    site_name = models.CharField(max_length=40, null=True)  #partner name field

    ...
    ...

【问题讨论】:

    标签: python django api rest


    【解决方案1】:

    AffyPartnerLinksViewSet.get_queryset 中,您将返回一个包含 USERaffiliates 实例的 QuerySet,但视图集和序列化程序需要一个包含 USERaffylinks 实例的 QuerySet。

    您需要修改此方法以返回正确模型的 QuerySet

    def get_queryset(self):
        #restrict to current logged in  user
        user = self.request.user
        return USERaffylinks.objects.filter(owneruserid=user)
    

    【讨论】:

    • 我的天哪!真是个错误。我犯了!谢谢@Iain 我太傻了!!!一遍又一遍地盯着自己的代码的乐趣!!!
    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 2017-05-30
    • 2022-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多