在Django admin面板展示DynamoDB数据的两类问题求助
Django Admin集成PynamoDB展示DynamoDB数据问题解决方案
问题1:仅能获取id属性、无法返回全部表属性
根因
DynamoDB属于无模式(Schemaless)数据库,表元数据的attribute_definitions仅会存储主键、索引键对应的属性定义,非键类的字段不会存入表的公共元数据中,因此你调用boto3的attribute_definitions接口只能获取到作为主键的id属性。
解决方法
不要依赖表元数据拉取字段,在你的PynamoDB模型中显式声明所有需要在Admin展示的属性即可,示例代码:
from pynamodb.models import Model from pynamodb.attributes import UnicodeAttribute, NumberAttribute class GoodsModel(Model): class Meta: table_name = "你的DynamoDB表名" region = "你的AWS区域" # 主键必须声明 id = UnicodeAttribute(hash_key=True) # 所有需要展示的非键属性都要显式声明 goods_name = UnicodeAttribute() price = NumberAttribute() stock = NumberAttribute()
如果存在动态新增的非预定义字段需要展示,可以重写模型的__getattr__方法,直接从PynamoDB返回的原始数据字典中读取对应键值。
问题2:注册PynamoDB模型到Admin时报错TypeError: 'MetaModel' object is not iterable
根因
Django Admin默认仅支持Django原生ORM的模型类,PynamoDB的模型使用了自定义的MetaModel元类,不符合Django Admin的注册规则,直接调用admin.site.register(Pynamo模型类)就会触发该迭代错误。
解决方法
自定义继承自admin.ModelAdmin的适配类,重写查询、数据读写等核心方法对接PynamoDB的接口,再完成注册即可,示例代码:
from django.contrib import admin from .models import GoodsModel class DynamoDBAdmin(admin.ModelAdmin): # 显式指定Admin列表页要展示的字段 list_display = ("id", "goods_name", "price", "stock") # 可指定搜索、过滤字段(过滤逻辑需要自行重写对应方法实现) search_fields = ("goods_name",) def get_queryset(self, request): # 重写查询方法,返回PynamoDB的扫描/查询结果 # 需要分页的话可以自行添加last_evaluated_key的分页逻辑 return GoodsModel.scan() # 适配Django Admin要求的模型属性 @property def model(self): return GoodsModel # 如果需要支持新增/编辑操作,重写save_model方法 def save_model(self, request, obj, form, change): obj.save() # 如果需要支持删除操作,重写delete_model方法 def delete_model(self, request, obj): obj.delete() # 注册时传入自定义的适配类 admin.site.register(GoodsModel, DynamoDBAdmin)
内容的提问来源于stack exchange,提问作者Muzamil Ahmed
相关产品推荐
相关产品推荐

