我有2个模型
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
employee_id = models.CharField(max_length=13, unique=True)
class UserRole(models.Model):
employee_id = models.ForeignKey(CustomUser, to_field='employee_id', unique=True, on_delete=models.CASCADE)
supervisor_id = models.CharField(max_length=20, null=True)
并已为两个模型定义了序列化器
class UserSerializer(serializers.ModelSerializer):
class Meta:
fields = '__all__'
model = models.CustomUser
class UserRoleSerializer(serializers.ModelSerializer):
class Meta:
fields = '__all__'
model = models.UserRole
考虑我在两个表中都有5条记录
如何从两个表中获取所有记录(电子邮件,employee_id,supervisor_id) 像,其中CustomUser.employee_id = UserRole.employee_id
我尝试过
models.CustomUser.objects.select_related('UserRole')
但是,无法从UserRole表中获取记录。
UserRole.objects.select_related('employee_id') -仅获取userRole记录 在此先感谢
答案 0 :(得分:0)
我认为从UserRole
开始,您也想获得有关employe
的所有信息。我在想什么,您想获取employee_id
Foreign_key关系的所有详细信息。可以通过
UserRole.objects.all()
使用以下序列化器。
class UserSerializer(serializers.ModelSerializer):
class Meta:
fields = ('email','employee_id',)
model = models.CustomUser
class UserRoleSerializer(serializers.ModelSerializer):
employee_id = UserSerializer()
class Meta:
fields = ('employee_id','supervisor_id',)
model = models.UserRole
答案 1 :(得分:0)
您不需要在Django中获得自动联接,不需要它,因为您可以仅遵循对象(the_object_you_get.its_foreign_key
上的ForeignKey关系。现在,当然,这将两次打击数据库。如果您希望避免这种情况,可以在需要使用的任何查询集上使用类似.prefetch_related('employee_id')
的名称。这样可以防止您多次访问数据库(当然,这要以较大的初始查询为代价)。
最后,如果您想序列化ForeignKey关系,Shakil给出的答案非常全面。唯一的事情是您不必将employee_id
字段设置为read_only=True
(有一点限制)。您还可以覆盖UserRoleSerializer
.create()
方法,以便它调用.create()
的{{1}}方法。