【问题标题】:How do I filter a Django model by an attribute of a relationship field?如何通过关系字段的属性过滤 Django 模型?
【发布时间】:2020-09-11 18:36:14
【问题描述】:

我正在尝试通过其 OneToOneField 关系“用户”的“用户名”属性来查询我的“个人资料”模型。

我试图通过使用 Profile.objects.get(owner.name = ...) 设置我的查询集来完成此操作,但是这样做时我收到一条错误消息,提示“SyntaxError:表达式不能包含赋值,也许你的意思是“==”?这很令人困惑,好像我将这些参数设置为“id = ...”之类的东西,我没有收到这样的错误。

我在这里做错了什么?如果我想通过“所有者”关系的“用户名”查询“个人资料”表,我该怎么做?

我在下面附上了我的代码。

models.py:

class User(models.Model):
    username = CharField(max_length = 80)

class Profile(models.Model):
    owner = models.OneToOneField('User', 
related_name = 'profile', on_delete = models.CASCADE)

views.py:

class UserProfile(generics.GenericAPIView, 
mixins.RetrieveModelMixin):
    def get_queryset(self):
        username = self.kwargs['username']
        return Profile.objects.filter(owner.username=username)
    serializer_class = UserProfileSerializer
    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

urls.py:

urlpatterns = [
    path('user/<str:username>/profile/', views.UserProfile.as_view()),
]

谢谢

【问题讨论】:

  • owner__username=username

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


【解决方案1】:

应该是

 Profile.objects.filter(owner__username=username)

不是这个

Profile.objects.filter(owner.username=username)

【讨论】:

  • 我把它改成了这个,现在我得到了以下错误:'AssertionError: Expected view UserProfile to be called with a URL关键字参数名为“pk”。修复您的 URL 配置,或正确设置视图上的 .lookup_field 属性。'
  • 你使用了双下划线吗??
【解决方案2】:

来自documentation

字段查找

字段查找是您指定 SQL WHERE 子句内容的方式。它们被指定为 QuerySet 方法 filter()、exclude() 和 get() 的关键字参数。

基本查找关键字参数采用表单字段 __lookuptype=value。 (这是一个双下划线)。

例如:

Entry.objects.filter(pub_date__lte='2006-01-01')

(大致)翻译成以下 SQL:

SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01';

因此,在您的情况下,您尝试按“所有者”字段上的“用户名”属性进行过滤,应该是:

return Profile.objects.filter(owner__username=username)

【讨论】:

    猜你喜欢
    • 2021-09-27
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 2019-08-23
    • 2011-07-06
    • 2019-07-06
    相关资源
    最近更新 更多