我正在尝试将this答案和此one结合起来,并使用for循环。

创建角色时,我想添加所有可能的技能(值为0),但是我对如何遵循上述答案感到困惑。

我有这个混入:

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吗?

在我的场景中该如何做?很抱歉,这很简单,但是我正在努力使自己转转。

最佳答案

在我看来,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()如果已经存在,则不会从数据库中获取它;如果不存在,则不会将其保存到数据库中。

关于python - 在Django中自动填充一组通用的多对多字段?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28437208/

10-09 21:06