【问题标题】:how to use queryset filter attribute depending on array in django?如何根据 Django 中的数组使用查询集过滤器属性?
【发布时间】:2018-01-29 13:25:51
【问题描述】:

如果我有:

data= request.data['participants'] 
Conversation.objects.filter(participants = data).values()

其中 data 是一组参与者,我想获得有这些参与者参与的对话。

我想将数组与外键(一对多)进行比较,以获取包含这些参与者的对话。

      {
        "conversation_id": 38,
        "created_at": "2017-08-14T09:15:19.776000Z",
        "name": "first conversation",
        "participants": [
            {
                "id": 1,
                "username": "zezor93",
            },
            {
                "id": 64,
                "username": "tasus22",
            }
        ]

    }

对话模型:

class Conversation(models.Model):
    user = models.ForeignKey(User, null=False)
    participants = models.ManyToManyField(User, related_name='participants')
    created_at = models.DateTimeField(_('created at'), auto_now_add=True)
    name = models.CharField(_("file title"), max_length=50, null=True, blank=True)

对话序列化器:

class ConversationSerializer(ModelSerializer):
    user = UserSerializer(many=False, read_only=True)
    participants = UserSerializer(many=True, read_only=True)

    class Meta:
        model = Conversation
        fields = '__all__'

我想根据参与者数组进行过滤的原因是,当我创建一组参与者的对话时,我需要知道是否与那些确切的参与者进行了对话,所以我不会创建它,我只会返回它,如果他们不是确切的参与者,我将创建一个新对话。

【问题讨论】:

  • in 将返回包含这些参与者之一的任何对话.. 我想获得在data= request.data['participants'] 中只有这组参与者数组的对话
  • 您的对话包含许多参与者或一个参与者?发布您的模型可能会有所帮助。你想在 data=request.data['participants'] 中得到只有这组参与者数组的对话,你的意思是什么?
  • @Ykh 我需要获得具有完全相同参与者的对话..

标签: python arrays django python-2.7 django-queryset


【解决方案1】:
Conversation.objects.filter(participants__id__in = [x['id'] for x in data]).values()

【讨论】:

  • 我需要获得具有完全相同参与者的对话.. 我的意思是您的解决方案将返回具有 participantsid=1id=64 的对话
【解决方案2】:
Conversation.objects.filter(participants__username__in = [participant['username'] for participant in data]).values()

我不太确定您打算做什么。 Hope this helps you

【讨论】:

  • 我需要获得具有完全相同参与者的对话.. 我的意思是您的解决方案将返回具有 participantsid=1id=64 的对话
  • @zezor93 我已经更改了答案,现在可以使用 `user_name' 对其进行过滤
  • 是的,我可以看到 .. 但是这将返回任何具有 zezor93 的对话或任何具有 tasus22 的对话 .. 我想返回只有彼此具有 zezor93tasus22 的对话。
  • 请发布您的模型
猜你喜欢
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 2019-10-08
相关资源
最近更新 更多