首页 > 解决方案 > Django通过外键查询某些属性

问题描述


我想从外键类中查询某些数据。有没有办法直接在查询中进行?

我想做以下查询:

plant_list = Plant.objects.filter(plant_product = ikey).values('plant_number', 'plant_name', 'plant_city', 'plant_country', 'plant_product')

我的结果是:

{'plant_number': '0001', 'plant_name': 'HoP1', 'plant_city': 3, 'plant_country': 1, 'plant_product': 1}

现在,例如在plant_city。我不想拥有我想要拥有模型 City 的属性 city_name 的 ID,它是外键。

所以这是我想要的结果:

{'plant_number': '0001', 'plant_name': 'HoP1', 'plant_city': 'Homburg', 'plant_country': 'Germany', 'plant_product': 1}

有没有优雅的方法?

那将是一个非常好的帮助!

这是我的模型:

class City(models.Model):
    city_name = models.CharField(max_length=100, unique=True)

    class Meta:
        ordering = ['city_name']
        # changes view in admin area
        verbose_name_plural = ('Cities')
    def __str__(self):
        return self.city_name

class Country(models.Model):
    country_name = models.CharField(max_length=100, unique=True)

    class Meta:
        ordering = ['country_name']
        verbose_name_plural = 'Countries'
    def __str__(self):
        return self.country_name    

class Plant(models.Model):
    plant_number = models.CharField(max_length=10, unique=True)
    plant_name = models.CharField(max_length=10, unique=True)
    plant_city = models.ForeignKey(City, on_delete=models.CASCADE)
    plant_country = models.ForeignKey(Country, on_delete=models.CASCADE)
    plant_product = models.ManyToManyField(TPZProductCluster1)
    updated_at = models.DateField(auto_now=True)

    class Meta:
        ordering = ['plant_number']
    def plant_produces(self):
        return ', '.join([p.pc1_product for p in self.plant_product.all()])
    def __str__(self):
        return self.plant_name + " (" + str(self.plant_number) +")"

先感谢您!!!

标签: pythondjango

解决方案


如果要包含城市名称,可以使用F对象:

from django.db.models import F

plant_list = Plant.objects.filter(
    plant_product=ikey
).values(
    'plant_number',
    'plant_name',
    'plant_country',
    'plant_product'
    city=F('plant_city__city_name')
)

话虽如此,通常使用.values()并不是一个好主意。例如,如果要将数据序列化为 JSON blob,最好使用序列化程序,例如使用Django REST 框架


推荐阅读