我在Django应用程序中的两个Model类上有1:多关系:
class CheckList(models.Model):
user = models.ForeignKey(User, related_name='checklists')
name = models.CharField(max_length=50)
class CheckListItem(models.Model):
user = models.ForeignKey(User, related_name='items')
checklist = models.ForeignKey(WishList, related_name='items')
is_checked = models.BooleanField(default=False)
大多数情况下,我想提供一个用户的清单和每个核对清单的项目,而且它非常香草。
但是,我还想要一些"虚拟清单"其中包含一组自定义列表项。
我想这样做:
def get_checklist_checked(user):
checklist = CheckList(name='My Checked Items', user=user)
checklist.items = CheckListItem.objects.filter(user=user, check=True)
return checklist
当然,checklist.items
是一个数组,而checklist.items
通常是一个经理。
处理这种情况的正确方法是什么?
答案 0 :(得分:0)
我了解了有关custom managers的更多信息,并了解如何使用自定义管理器预定义查询。
但是,我基本上要求仅在CheckListItem
类的某些实例中更改用于CheckList
的相关访问的管理器,我认为这不可能。
我决定的是因为我已经有了一组将模型转换为dicts的DTO方法(因为这些方法直接转换为JSON响应),所以我根本不会使用CheckList类来处理瞬态CheckLists。相反,我会直接获取过滤的项目并编码DTO方法以接受CheckList对象或清单名称和项目。
def get_checklist(request, checklist_id):
#get a special 'transient' checklist
if checklist_id == 'checkedItems':
items = CheckListItem.objects.filter(is_checked=True)
dto = getCheckListDto(items=items, name="Checked Items")
#get a regular checklist
else:
cl = CheckList.objects.get(checklist_id)
dto = getCheckListDto(checklist=cl)
return HttpResponse(json.dumps(dto), content_type="application/json")
#Can pass in either a checklist object, or name + items array
def getCheckListDto(checklist=None, items=[], name=None):
if checklist is not None:
items = checklist.items.all()
name = checklist.name
return {
'name': name,
'items': [getCheckListItemDto(i) for i in items]
}
我唯一可以看到使用自定义管理器的地方是提供一个管理器来仅获取is_checked核对表项目,这样我就可以CheckListItem.checked_objects.all()
。但由于过滤器非常简单,我没有打扰。
如果有人有更好的想法,特别是如果我错过了自定义管理员可以帮助的方式,请随时提交答案。