如何在Django中通过外键连接从对象获取特定值?

2024-05-14 03:32:02 发布

您现在位置:Python中文网/ 问答频道 /正文

伙计们! 我得到了下表,希望从Model3D的对象中获取所有scad文件,其中的部分不为null,并且与Model3D具有相同的id。Model3D是一个3D打印机对象,它可能由多个零件组成,因此具有保存原始模型id的“part of”属性

class Model3D(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=300)
    description = models.CharField(max_length=500)
    original_Model = models.ForeignKey('Model3D', on_delete=models.CASCADE, null=True)
    creation_Date = models.DateTimeField(auto_now=True)
    stl_File = models.FileField(null=True, upload_to='models/stlFiles')
    scad_File = models.FileField(null=True, upload_to='models/scadFiles')
    parameter_id = models.ForeignKey('Parameter', on_delete=models.CASCADE, null=True)
    part_of = models.ForeignKey('Model3D', related_name="part_of_model3d", on_delete=models.CASCADE, null=True)

我尝试了以下方法:part_models_scad_files = Model3D.objects.filter(part_of__isnull=False).select_related(id=self.id)

但我如何获取scad文件,而不仅仅是对象

谢谢你的帮助,我真的很想了解更多


Tags: 文件of对象idtruemodelonmodels
2条回答

这里的技巧是使用^{}-expression

part_models_scad_files = Model3D.objects.select_related('part_of').filter(part_of__isnull=False, id=F('id')).values_list('scad_File', flat=True)

您可能不会在一个“select\u related”中进行筛选,它是调用相关的“field name”,似乎不需要select\u related,您可以简单地使用案例1

在您的情况下,如果您希望获得具有特定ID的结果,您可以使用

案例1

part_models_scad_files = Model3D.objects.get(part_of__isnull=False, id = self.id)
print(part_models_scad_files.scad_file)

案例2(用于评估2个表)

part_models_scad_files = Model3D.objects.filter(part_of__isnull=False, id = self.id).select_related('part_of')
for entry in part_models_scad_files:
    print(entry.scad_file)

案例3(如果您只想要scad_文件的列表)

part_models_scad_files = Model3D.objects.filter(part_of__isnull=False, id = self.id).select_related('part_of').values_list('scad_file', flat = True)

相关问题 更多 >