2014-09-19 53 views
1

我有一個1:在兩個模型類在我的Django應用一對多的關係:如何創建自定義的外國套Django模型

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

你想在list.items被調用時返回對象的相關列表項嗎?另外,請使用比'list'更好的變量。 – karthikr 2014-09-19 13:59:08

+0

爲了說明的目的,我使用泛型,但我可以看到它如何變得混亂。大多數時候,list.items檢索相關項目(基於FK關係),但是我希望能夠構建臨時的'list'對象(它們本身不在數據庫中)。一個例子中的「list」對象將包含所有具有「check = True」的項目。 – ryansilva 2014-09-19 14:05:02

+0

你有沒有考慮過使用「自定義管理器」? – karthikr 2014-09-19 14:20:30

回答

0

我學到了更多關於custom managers的內容,我理解我如何使用自定義管理器來預定義查詢。

但是,我實質上只是在CheckList類的某些情況下要求更改用於CheckListItem的相關訪問的管理器,並且我認爲這不可能。

我的決定是因爲我已經有一套DTO方法將模型轉換爲字典(因爲這些方法直接進入JSON響應),所以我暫時不會使用CheckList類來執行瞬態校驗列表。相反,我會直接獲取過濾項目,並編寫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()唯一的地方。但由於過濾器非常簡單,所以我沒有打擾。

如果有人有更好的主意,特別是如果我錯過了定製經理可以幫助的方式,請隨時提交答案。