2017-09-05 58 views
1

上創建實例表中的連接在下面的簡單的系統,其中用戶可以收集任何數量的任何類型的徽章的:自動生成在Django

__________   _____________   _______ 
| User  |   | BadgeDone |   | Badge | 
| -------- | <------ | ----------- | ------> | ----- |    
| username |   | count = 0 |   | name | 
|__________|   | FK user_id |   |_______| 
        | FK badge_id | 
        |_____________| 

models.py:

class BadgeDone(models.Model): 
    count = models.IntegerField(default = 0) 

    user = models.ForeignKey(
     'auth.User', 
     on_delete = models.CASCADE, 
    ) 

    badge = models.ForeignKey(
     'Badge', 
     on_delete = models.CASCADE, 
    ) 

    def __str__(self): 
     return self.user.username + '_' + self.badge.name 

class Badge(models.Model): 
    name = models.CharField(max_length = 50) 

    def __str__(self): 
     return self.name 

我試圖自動創建新創建的用戶和每個現有的徽章之間的連接,反之亦然(即在新創建的徽章和每個現有用戶之間)。

,得到期望的行爲的一個例子:

Badges.objects.all() 
<QuerySet [<Badge: Bronze>, <Badge: Silver>, <Badge: Gold>]> 

BadgesDone.objects.all() 
<QuerySet []> 

User.object.all() 
<QuerySet []> 

u = User(username='John') 
u.save() 

Badges.objects.all() 
<QuerySet [<Badge: Bronze>, <Badge: Silver>, <Badge: Gold>]> 

BadgesDone.objects.all() 
<QuerySet [<BadgeDone: John_Bronze>, <BadgeDone: John_Silver>, <BadgeDone: John_Gold>]> 

User.object.all() 
<QuerySet [User: John]> 

b = Badge(name='BlackGold') 
b.save() 

Badges.objects.all() 
<QuerySet [<Badge: Bronze>, <Badge: Silver>, <Badge: Gold>, <Badge: BlackGold>]> 

BadgesDone.objects.all() 
<QuerySet [<BadgeDone: John_Bronze>, <BadgeDone: John_Silver>, <BadgeDone: John_Gold>, <BadgeDone: John_BlackGold>]> 

User.object.all() 
<QuerySet [User: John]> 

目前我使用的掃描丟失的連接,並生成這些外部腳本,但這只是爲快速概念性測試OK,所以我的問題。 在確保鬆散耦合的保留的同時,在Django中實現這一點的正確方法是什麼?

+0

你說的是'makemigrations'? –

回答

0

你可以嘗試Django的post-save信號

from django.db.models.signals import post_save 
from django.dispatch import receiver 

@receiver(post_save, sender=User, dispatch_uid="user_badges_add") 
def badges_add(sender, instance, created, **kwargs): 
    if created: 
     for badge in Badges.objects.all(): 
      BadgesDone.objects.create(user=instance, badge=badge) 
+0

謝謝,只是測試它,它確實是我所需要的。 – Lukas