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