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

Retrieving multiple rows from seperate model in django relationships

我已经为这个困惑苦苦挣扎了几个小时。这是我正在尝试做的事情的架构。

我有一个用户模型和一个配置文件模型,这是一个 one-to-one 关系,但我希望能够查询用户并检索用户的所有电子邮件地址(来自用户模型)共享同一家公司(来自配置文件模型)。公平地说,我对 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'
        ) 

我很感激任何可能导致解决方案的线索。

首先,您还应该为您的用户添加 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' 属性