2015-02-10 91 views
1

我試圖結合this答案和這個one,與一些for循環。在Django中自動生成一組通用多對多字段?

在創建角色時,我想添加所有可能的技能值爲0,但我對如何遵循上述答案感到困惑。

我有這樣的mixin:

class CrossCharacterMixin(models.Model): 
    cross_character_types = models.Q(app_label='mage', model='mage') 
    content_type = models.ForeignKey(ContentType, limit_choices_to=cross_character_types, 
            null=True, blank=True) 
    object_id = models.PositiveIntegerField(null=True) 
    content_object = GenericForeignKey('content_type', 'object_id') 

    class Meta: 
     abstract = True 

(最終爲cross_character_types將擴大)

而這一模式:

class CharacterSkillLink(Trait, CrossCharacterMixin): 
    PRIORITY_CHOICES = (
     (1, 'Primary'), (2, 'Secondary'), (3, 'Tertiary') 
    ) 
    skill = models.ForeignKey('SkillAbility') 
    priority = models.PositiveSmallIntegerField(
     choices=PRIORITY_CHOICES, default=None) 
    speciality = models.CharField(max_length=200, null=True, blank=True) 

    def __str__(self): 
     spec_string = " (" + self.speciality + ")" if self.speciality else "" 
     return self.skill.skill.label + spec_string 

我已經開始寫入此,在NWODCharacter模型上:

def save(self, *args, **kwargs): 
    if not self.pk: 
     character_skills_through = CharacterSkillLink.content_object.model 

     CharacterSkillLink.objects.bulk_create([ 
      [character_skills_through(skill=SkillAbility(
       skill), content_object=self) for skill in SkillAbility.Skills] 
     ]) 

    super(NWODCharacter, self).save(*args, **kwargs) 

這不起作用,因爲我不認爲我傳遞了正確的對象。在此基礎上answer雖然

from django.db import models 

class Users(models.Model): 
    pass 

class Sample(models.Model): 
    users = models.ManyToManyField(Users) 

Users().save() 
Users().save() 

# Access the through model directly 
ThroughModel = Sample.users.through 

users = Users.objects.filter(pk__in=[1,2]) 

sample_object = Sample() 
sample_object.save() 

ThroughModel.objects.bulk_create([ 
    ThroughModel(users_id=users[0].pk, sample_id=sample_object.pk), 
    ThroughModel(users_id=users[1].pk, sample_id=sample_object.pk) 
]) 

在這種情況下,什麼是我的ThroughModel?是CharacterSkillLink.content_object.model

我如何在我的場景中做到這一點?我很抱歉,如果這是微不足道的,但我正在努力讓我的頭腦。

+0

downvoter讓我知道如何改善這個問題? – Pureferret 2015-02-11 15:35:29

回答

1

它看起來對我來說,CharacterSkillLink本身是你通過在這種情況下,模型...它一般加入的內容類型爲SkillAbility

如果你仔細想想,也有道理,如果你正在做一個bulk_create您傳入的對象必須與您正在做的bulk_create相同。

所以我想你想是這樣的:

def save(self, *args, **kwargs): 
    initialise_skill_links = not self.pk 
    super(NWODCharacter, self).save(*args, **kwargs) 
    if initialise_skill_links: 
     CharacterSkillLink.objects.bulk_create([ 
      CharacterSkillLink(
       skill=SkillAbility.objects.get_or_create(skill=skill)[0], 
       content_object=self 
      ) 
      for skill in SkillAbility.Skills 
     ]) 

注意你有你的bulk_create裏面太多對[]

另外我認爲你應該使用SkillAbility.objects.get_or_create() ...作爲一個外鍵你需要相關的對象存在。只要做SkillAbility()不會從數據庫中獲取,如果它已經存在,並且不會將它保存到數據庫,如果它不存在。

+0

字面上剛剛離開工作,回家。明天會嘗試使用這個。你是對的btw,'CharacterSkillLink'是我的模型......我不知道我在想什麼。 – Pureferret 2015-02-10 17:48:36

+0

這對我的管理頁面正常工作,但它沒有顯示內聯下拉框(單獨問題)的任何技能。我刪除了內聯,看它是否會創建並保存技能,但現在它給了我兩個錯誤。第一個在錯誤頁面的頂部:'ValueError at/admin/characters/mage/add /'和 '不能分配「(,False)」:「CharacterSkillLink.skill」必須是「 SkillAbility「實例。'然後,'格式化出錯:'CharacterSkillLink'對象沒有'speciality''屬性設置'speciality =「」'並指定不起作用。幫幫我? – Pureferret 2015-02-11 08:52:28

+0

我發現'get_or_create'這個問題返回一個元組,並且技能被分配這個tutple,而不是'SkillAbility'對象。這似乎應該工作(它不會錯誤),但我不認爲它工作。我已經添加了一個GenericRelation,當我保存並嘗試訪問'mage_instance.skills.all()'它返回並清空列表。 – Pureferret 2015-02-11 11:58:13

相關問題