2016-03-09 27 views
-1

到對象,我想分配給他們的客戶,並顯示標籤的節目列表,但我有問題,因爲我有我的其他表標籤,我不知道如何將數據連接在一起。客戶可以有幾個標籤或沒有。做到這一點的方法是正確的?你能幫我一些建議嗎?我需要一個帶有標籤的變量,逗號或帶有標籤的對象可以在模板引擎中使用。的Django如何添加數據從查詢集

Views.py:

@user_passes_test(lambda u: u.is_staff, login_url='/account/login/') 
def client_list(request): 
    dict = {} 
    dict['clients'] = Client.objects.all() 

    return render(request, 'panel/client/list.html', dict) 

Models.py:

class Client(models.Model): 
    id = models.OneToOneField(User, on_delete=models.CASCADE, unique=True, primary_key=True) 
    uuid = models.UUIDField(default=uuid.uuid4, editable=False) 
    name = models.CharField(max_length=256, unique=True) 

class TagsClientChoices(models.Model): 
    name = models.CharField(max_length=80, unique=True) 

class TagsClientList(models.Model): 
    tag_id = models.ForeignKey('TagsClientChoices') 
    client = models.ForeignKey('Client', blank=True, null=True) 
+0

是你的問題只是如何訪問一個一對多的模式?... – Sayse

+0

無不是我的問題。我想要添加到每個客戶端的所有客戶端顯示列表,這些客戶端標籤保存在TagsClientList中。這不是OneToOneField因爲我沒有在客戶端模式連接到TagsClientList。總之,我需要根據CLIENT_ID標籤,並顯示它,但我不知道這些沒有在模型中加入現場的連接方式。 – Thaian

+0

[多到一的關係。(https://docs.djangoproject.com/en/1.9/topics/db/examples/many_to_one/) – Sayse

回答

1

默認情況下,每一個外鍵與_set反向關係

,所以你可以做

for client in clients: 
    for taglist in client.tagsclientlist_set.all(): 
     # use taglist 

雖然這可能不是很高性能,你可能要prefetch_related並提供related_name將在兩個查詢而不是多個檢索結果。

class TagsClientList(models.Model): 
    tag_id = models.ForeignKey('TagsClientChoices') 
    client = models.ForeignKey('Client', blank=True, null=True, related_name='tags_list') 



dict['clients'] = Client.objects.all().prefetch_related('tags_list') 

for client in clients: 
    for taglist in client.tags_list.all(): 
     # use taglist 
+0

注意:您不需要'related_name'爲' prefetch_related'工作,'_set'反向關係也可以工作 – Sayse

+1

'prefetch_related'會導致運行**兩個**數據庫查詢,但它肯定會更高效。 – rnevius

+1

@rnevius - 謝謝! (錯誤地提到「單個查詢」,但實際上只是指fk查找) – Sayse