【问题标题】:Failing to lookup a field with a foreign key subfield in Django Rest Framework无法在 Django Rest Framework 中查找具有外键子字段的字段
【发布时间】:2019-01-13 07:23:54
【问题描述】:

我正在使用 django 框架来序列化一个 django 对象。我有一个配置文件模型,模型中的第一个字段是用户对象的外键。我希望能够传递用户名是配置文件的 url 模式。在视图中,我希望能够获取该用户名并通过用户外键并找到具有该用户名用户的配置文件。这就是我现在在我的代码中的内容:

Views.py

class ProfileListView(ListAPIView):
    query_set = Profile.objects.all()
    serializer_class = ProfileSerializer

class ProfileDetailView(RetrieveAPIView):
    query_set = Profile.objects.all()
    serializer_class = ProfileSerializer
    lookup_field = 'user__username'

urls.py

path('profile/', ProfileListView.as_view()),
path('profile/<username>', ProfileDetailView.as_view()),

序列化器.py

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ('user', 'gender', 'phone', 'ip_address', 'dob_month', 'dob_day',
                  'dob_year', 'address_street', 'address_city', 'address_state',
                  'address_postal', 'address_country', 'profile_pic', 'role')

models.py

class Profile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    gender = models.CharField(max_length=12, choices=GENDER_CHOICES) # entity type
    phone = models.CharField(max_length=22)
    ip_address = models.CharField(max_length=32)
    dob_month = models.CharField(max_length=22, choices=MONTH_CHOICES)
    dob_day = models.SmallIntegerField()
    dob_year = models.SmallIntegerField()
    address_street = models.CharField(max_length=140)
    address_city = models.CharField(max_length=22)
    address_state = USStateField()
    address_postal = models.IntegerField()
    address_country = models.CharField(max_length=22)
    profile_pic = models.ImageField(upload_to='profile_pics/')
    role = models.CharField(max_length=12, choices=ROLE_CHOICES)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.user.username + ' - ' + self.type

【问题讨论】:

    标签: python django django-models django-rest-framework


    【解决方案1】:

    一种方法是覆盖get_object 方法。试试这样:

    class ProfileDetailView(RetrieveAPIView):
        queryset = Profile.objects.all()  # it should be queryset not query_set
        serializer_class = ProfileSerializer
    
        def get_object(self):
           return self.queryset.get(user__username=self.kwargs.get('username')).first()
    

    还有一些替代解决方案。为此,请在SO 中查看此答案。

    【讨论】:

      猜你喜欢
      • 2019-07-03
      • 2019-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 2012-12-31
      • 2013-01-15
      • 2021-09-03
      • 1970-01-01
      相关资源
      最近更新 更多