Как получить поля справочной таблицы с помощью запроса к модели 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.

Вернуться на верх