【发布时间】: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
...
...
【问题讨论】: