有没有一种方法可以从模型实例dict对象中的联接表中获取列


t = PurchaseHeader.objects.first()
t.__dict__
{
'_state': <django.db.models.base.ModelState object at 0x7f4b34aa7fa0>, 
'id': 3, 
'ref': 'jhkh', 
'goods': Decimal('-100.00'), 
'discount': Decimal('0.00'), 
'vat': Decimal('-20.00'), 
'total': Decimal('-120.00'), 
'paid': Decimal('-120.00'), 
'due': Decimal('0.00'), 
'date': datetime.date(2020, 11, 7), 
'due_date': datetime.date(2020, 11, 14), 
'period': '202007', 
'status': 'c', 
'created': datetime.datetime(2020, 11, 7, 15, 46, 48, 191772, tzinfo=<UTC>), 
'cash_book_id': None, 
'supplier_id': 1128, 
'type': 'pc'
}

当我加入供应商表时,我很失望地发现dict中没有包含这些列。下面,t.__dict__与上面相同。我注意到Supplier模型实例缓存在t._state中,所以我想我可以创建自己的方法,所有模型都从中继承,做我想要的事情-dict中所有表中的所有列。但我想知道是否有人知道开箱即用的方法?

t = PurchaseHeader.objects.select_related("supplier").first()
t.__dict__

select_related的目标实际上是预取数据,这样在访问"supplier"时就不需要在第二个查询中提取数据。相反,它已经使用原始查询中的联接获取了这些数据。

如果您想获得一个基于模型的dict,其中还包含关系的数据,那么最好使用带有嵌套序列化程序的ModelSerializer。假设你的供应商模型被称为Supplier,它看起来像这样:

class SupplierSerializer(serializers.ModelSerializer):
class Meta:
model = Supplier
fields = ['name', 'other_field'] # Add more Supplier fields
class PurchaseHeaderSerializer(serializers.ModelSerializer):
supplier = SupplierSerializer(read_only=True)
class Meta:
model = PurchaseHeader
fields = ['supplied', 'vat', 'total'] # Add more PurchaseHeader fields

然后,您可以像这样使用PurchaseHeaderSerializer

purchase_header = PurchaseHeader.objects.select_related("supplier").first()
the_dict_you_want = PurchaseHeaderSerializer(instance=purchase_header).data 

最新更新