在Django关系中从单独的模型检索多行

时间:2020-10-14 19:28:50

标签: django django-serializer

这个问题困扰了我几个小时。这是我要执行的操作的模式。

enter image description here

我有一个用户模型和一个个人档案模型,这是一对一的关系,但是我希望能够查询用户并从共享用户模型中检索所有电子邮件地址(共享用户模型)同一家公司(来自配置文件模型)。公平地讲,我对django的理解是有限的,但是我通过了serializer relations指南,并尝试了此处描述的最多方法,但没有用。在这一点上,我什至不确定自己在正确的道路上。

所以,我的理解是

  1. 我需要从用户那里获取个人资料(一种source='profile'方法可能有效)
  2. 从该个人资料中,我需要检索公司
  3. 从该公司,我需要检索属于该公司的所有user_id
  4. 我需要从这些user_id中查找所有这些用户的电子邮件字段
  5. 我还需要过滤出发出请求的用户的电子邮件地址

这有意义吗?在这一点上,我正在尝试通过序列化器完成所有这些操作,但未成功。这是我尝试过的一些代码片段,但不幸的是,我怀疑它们中的任何一个都将指向任何形式的解决方案。

class TeamEmailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['email']

class UserSerializer(serializers.ModelSerializer):

    ...

    # only one of them was present at a time, but none gave any promising results

    test_one = Profile.objects.filter(source=profile.company.id).values_list('user_id', flat=True)

    test_one = serializers.RelatedField(source='profile.company.id', read_only=True)

    test_one = TeamEmailsSerializer(many=True, read_only=True)

    test_one = serializers.PrimaryKeyRelatedField(source='email', queryset=User.objects.filter())

    class Meta:
        model = User
        fields = (
            'test_one'
        ) 

对于任何可能导致解决方案的线索,我深表感谢。

1 个答案:

答案 0 :(得分:1)

首先,您还应该在用户上添加company FK,这将使您的工作更加轻松。

然后,您可以在User模型上定义新方法:

class User(AbstractBaseUser):
  ...

  def other_users_emails(self):
    return self.company.users.exclude(pk=self.id).values_list('email', flat=True)

然后在序列化程序中将'other_users_emails'添加到fields列表中。

或者,您可以在序列化程序上修改to_representation方法,然后直接在其中添加'other_users_emails'属性