从 Django 关系中的单独模型中检索多行
Retrieving multiple rows from seperate model in django relationships
我已经为这个困惑苦苦挣扎了几个小时。这是我正在尝试做的事情的架构。
我有一个用户模型和一个配置文件模型,这是一个 one-to-one 关系,但我希望能够查询用户并检索用户的所有电子邮件地址(来自用户模型)共享同一家公司(来自配置文件模型)。公平地说,我对 django 的理解是有限的,但我阅读了 serializer relations 指南并尝试了那里描述的最多方法,但无济于事。在这一点上,我什至不确定我走在正确的道路上。
所以,我的理解是
- 我需要从用户那里获取配置文件(
source='profile'
方法可能有效)
- 我需要从该配置文件中检索公司
- 从那家公司,我需要检索属于那家公司的所有 user_id
- 从那些 user_id 中,我需要查找所有这些用户的电子邮件字段
- 我还需要过滤掉发出请求的用户的电子邮件地址
这有意义吗?在这一点上,我试图从序列化程序完成所有这些,但没有成功。以下是我尝试过的一些代码片段,但不幸的是,我怀疑它们是否会指向任何形式的解决方案。
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'
属性
我已经为这个困惑苦苦挣扎了几个小时。这是我正在尝试做的事情的架构。
我有一个用户模型和一个配置文件模型,这是一个 one-to-one 关系,但我希望能够查询用户并检索用户的所有电子邮件地址(来自用户模型)共享同一家公司(来自配置文件模型)。公平地说,我对 django 的理解是有限的,但我阅读了 serializer relations 指南并尝试了那里描述的最多方法,但无济于事。在这一点上,我什至不确定我走在正确的道路上。
所以,我的理解是
- 我需要从用户那里获取配置文件(
source='profile'
方法可能有效) - 我需要从该配置文件中检索公司
- 从那家公司,我需要检索属于那家公司的所有 user_id
- 从那些 user_id 中,我需要查找所有这些用户的电子邮件字段
- 我还需要过滤掉发出请求的用户的电子邮件地址
这有意义吗?在这一点上,我试图从序列化程序完成所有这些,但没有成功。以下是我尝试过的一些代码片段,但不幸的是,我怀疑它们是否会指向任何形式的解决方案。
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'
属性