Python 自动填充Django中的一组通用多对多字段?

Python 自动填充Django中的一组通用多对多字段?,python,django,django-contenttypes,Python,Django,Django Contenttypes,我试着把答案和这个结合起来,再加上一点for循环 在创建角色时,我想添加值为0的所有可能技能,但我对如何遵循上述答案感到困惑 我有这个混音器: class CrossCharacterMixin(models.Model): cross_character_types = models.Q(app_label='mage', model='mage') content_type = models.ForeignKey(ContentType, limit_choices_to=c

我试着把答案和这个结合起来,再加上一点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
(最终,将扩展
交叉字符类型

这个模型:

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)
这不起作用,因为我认为我没有传递正确的对象

但基于此:

在这种情况下,通过模型我的
是什么?是不是
CharacterSkillLink.content\u object.model


在我的场景中如何做到这一点?如果这是琐碎的话,我很抱歉,但我正努力想办法解决它。

在我看来,
CharacterSkillLink
本身就是你在这种情况下的直通模型。。。它通常将内容类型连接到
SkillAbility

仔细想想,如果你正在进行
bulk\u创建
,你传入的对象必须与你正在进行
bulk\u创建
的对象具有相同的模型,这也是有意义的

所以我想你想要这样的东西:

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
        ])
注意:您的
批量创建中有太多对
[]


另外,我认为您应该使用
SkillAbility.objects.get\u或\u create()
。。。对于外键,需要相关对象存在。如果数据库已经存在,那么仅仅执行
SkillAbility()
将不会从数据库中获取它,如果数据库不存在,则不会将它保存到数据库中。

实际上只是离开了工作,回家了。我明天会试着用这个。你是对的,顺便说一句,
CharacterSkillLink
是我的直通模式…我不知道我在想什么。这在我的管理页面上运行良好,但它没有在下拉框中显示该内联的任何技能(单独的问题)。我删除了内联,看看它是否会创建和保存技能,但现在它给了我两个错误。第一个是在错误页面的顶部:
ValueError at/admin/characters/mage/add/
无法分配“(,False)”:“CharacterSkillLink.skill”必须是“SkillAbility”实例。
然后,
格式错误:“CharacterSkillLink”对象没有属性“speciality”
设置
speciality=“”
和指定无效。帮助?我发现问题
get\u或\u create
返回一个元组,skill被分配给这个元组,而不是
SkillAbility
对象。这似乎应该是可行的(它不会出错),但我认为它不可行。我已经为它添加了一个通用关系,当我保存并尝试访问
mage\u instance.skills.all()
时,它返回空列表。我已经用您想要进行的编辑更新了答案,还添加了
[0]
来处理元组问题。问题是没有
对象id
可以设置,因为我们是在一个
如果不是self.pk
块中执行此代码。。。会更新答案吗?悲观的选民能告诉我如何改进这个问题吗?
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
        ])