Как получить поля справочной таблицы с помощью запроса к модели django
Когда я пытаюсь получить таблицу с внешним ключом с помощью модели django, я не могу получить только детали таблицы, на которую ссылаюсь.
У меня есть две модели TblVersion и TblProject, определенные ниже
class TblVersion(models.Model):
version_id = models.AutoField(primary_key=True)
project = models.ForeignKey(TblProject, models.DO_NOTHING)
version_major = models.PositiveSmallIntegerField()
version_minor = models.PositiveSmallIntegerField()
class Meta:
managed = False
db_table = 'tbl_version'
class TblProject(models.Model):
project_id = models.AutoField(primary_key=True)
project_name = models.CharField(max_length=32)
class Meta:
managed = False
db_table = 'tbl_project'
My current code implementation:
result= TblVersion.objects.all().select_related()
data = serializers.serialize('json', result)
print(data)
Code Result:
`[{"model": "CCM_API.tblversion", "pk": 1, "fields": {"project": 1, "version_major": 1000, "version_minor": 0}}, {"model": "CCM_API.tblversion", "pk": 2, "fields": {"project": 2, "version_major": 1000, "version_minor": 0}}, {"model": "CCM_API.tblversion", "pk": 3, "fields": {"project": 2, "version_major": 1000, "version_minor": 2}}]`
The code output lacks the foreign key fields (Project Name). I want a list of version numbers with their respective projects like this.
| Version Id | Major Version | Minor Version | Project Id | Project Name|
| -------- | -------- |-------- |-------- |-------- |
| 1 | 1000 |1 | 1| PROJ_1 |
| 2 | 1000 |1 | 2| PROJ_2 |
| 3 | 1000 |2 | 1| PROJ_1 |
метод select_related принимает аргумент полей, относящихся к другой модели
result= TblVersion.objects.all().select_related("product")
Update
Чтобы добавить эти связанные поля к сериализуемым, вы можете перечислить значения как
result = TblVersion.objects.all().select_related("product").values("id", "version_id", ..., "product__id", "product__name")
Вот текущая реализация моего кода, который решил проблему.
projects = []
result = TblVersion.objects.all()
for ver in result:
versions.append({
'id':ver.version_id,
'major_version':ver.version_major,
'minor_version':ver.version_minor,
'project_name':ver.project.project_id,
'project_name':ver.project.project_name,
})
Вы можете использовать сериализаторы для просмотра полей таблицы, на которую ссылаетесь.
#models.py
class Product(models.Model):
seller=models.ForeignKey(CustomUser,on_delete=models.CASCADE,null=True,blank=True)
pname=models.CharField(max_length=100)
category=models.CharField(max_length=100)
description=models.TextField(null=True,blank=True)
price=models.FloatField()
def __str__(self) -> str:
return self.pname
class Order(models.Model):
buyer=models.ForeignKey(CustomUser,on_delete=models.CASCADE,null=True,blank=True)
product=models.ForeignKey(Product,on_delete=models.CASCADE)
quantity=models.IntegerField()
totalprice=models.FloatField()
def __str__(self) -> str:
return self.product.pname
#serializers.py
class OrderSerializer(ModelSerializer):
pname=serializers.CharField(source="product.pname",read_only=True)
category=serializers.CharField(source="product.category",read_only=True)
description=serializers.CharField(source="product.description",read_only=True)
pprice=serializers.CharField(source="product.price",read_only=True)
class Meta:
model=Order
fields=['id','buyer','product','pname','category','description','pprice','quantity','totalprice']
В сериализаторе мы явно пропишем поля, которые нам нужны из ссылающейся таблицы, и сделаем их read_only True, чтобы они просматривались только в get-запросе. Затем мы включим их в поля, чтобы мы могли получить их в нашем api.