简体   繁体   English

如何从 django 中的两个模型中获取详细信息

[英]How to get details from two models in django

I am trying to build an api endpoint that performs a GET request, path -> {url}/api/v1/users/:id我正在尝试构建一个执行 GET 请求的 api 端点,路径 -> {url}/api/v1/users/:id

I have three models我有三个模型

class PvSystem(models.Model):
   modelNo = models.CharField(max_length=10, blank=False, default='')
   modelName = models.CharField(max_length=10, blank=False, default='')
   dimensionPanel: models.FloatField(max_length=10, blank=False, default=NULL)
   elevation = models.FloatField(max_length=10, blank=False, default=NULL)
   kwhPeak = models.FloatField(max_length=10, blank=False, default=NULL)
   avergaeSurplus = models.FloatField(max_length=10, blank=False, default=NULL)

class EnergyData(models.Model):
   pvId = models.ForeignKey(PvSystem,related_name='orders',on_delete=models.CASCADE)
   energyNeeded = models.FloatField(max_length=10, blank=False, default=NULL)
   energyConsumption = models.FloatField(max_length=20, blank=False, default=NULL)
   energyProduction = models.FloatField(max_length=20, blank=False, default=NULL)
   energySurplus = models.FloatField(max_length=20, blank=False, default=NULL)
   floorPrice = models.FloatField(max_length=10, blank=False, default=NULL)
   capPrice = models.FloatField(max_length=10, blank=False, default=NULL)
   pvStatus = models.BooleanField(blank=False, default=False)
   dsoId = models.CharField(max_length=70, blank=False, default='')
   supplier = models.CharField(max_length=70, blank=False, default='')

class User(models.Model):
   name = models.CharField(max_length=70, blank=False, default='')
   email = models.EmailField(max_length=70, blank=False, default='')
   password = models.CharField(max_length=70, blank=False, default='')
   address = models.CharField(max_length=70, blank=False, default='')
   roleId = models.IntegerField(blank=False, default='1')
   isActive = models.BooleanField(blank=False, default=TRUE)
   dsoId = models.CharField(max_length=70, blank=False, default='')
   supplier = models.CharField(max_length=70, blank=False, default='')
   dateJoined = models.DateTimeField(auto_now_add=False, blank=False, default=NULL)

Models Description型号说明

UserModel: Registered details of the user. UserModel:用户的注册详细信息。 EnergyData: A table that provides more details of the user using the users dsoID and supplier to check. EnergyData:一个提供更多用户详细信息的表,使用用户 dsoID 和供应商进行检查。 PVSystem: Connected to the Energydata hence return result of a user with energy data and pvstatus TRUE. PVSystem:连接到 Energydata,因此返回具有能源数据和 pvstatus TRUE 的用户结果。

From the above, when the api get request call is made, it is supposed to provide a result of user depending on the id, but i want it to show not only contents on the user model but contents on the energy data model(by doing a check using the dsoID and supplier of that user called.)从上面可以看出,当调用 api get 请求时,它应该根据 id 提供用户结果,但我希望它不仅显示用户 model 的内容,还显示能源数据模型的内容(通过做使用该用户的 dsoID 和供应商进行检查。)

Please how can i achieve this?请问我怎样才能做到这一点? I am a newbie to django.我是 django 的新手。

You can try it in this way:你可以这样试试:

user = User.objects.get(dsoId=id)#I am assuming dsoId as primary key
enrgydata = EnergyData.objects.get(dsoId=user.dsoId) 

If the relation between Users and EnergyData is One-to-One, then you can directly use id from url parameter to query EnergyData.table.如果UsersEnergyData是一对一的关系,那么可以直接使用url参数中的id来查询EnergyData.table。 If it is One-to-Many or Many-To-One, you need to do in above method.如果是一对多或多对一,则需要按上述方法进行。

class EnergyDataSerializer(serializers.ModelSerializer):
    def profile_info(self, obj): 
        prof_obj= User.objects.get(dsoId=obj.dsoId)

        # access the fields or serialize the data if you can in other way. I am simply returning it in key:value
        return {'id':prof_obj.id, 'name':prof_obj.name, 'email': prof_obj.email}

    profile = serializers.SerializerMethodField('profile_info')
    class Meta:
            model = EnergyData
            fields ='__all__'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM