如何从2个表中获取所有记录

时间:2019-02-15 13:28:26

标签: django

我有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记录 在此先感谢

2 个答案:

答案 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}}方法。