0

我有一个models.py:

class Skill(models.Model):
    title = models.CharField(max_length=255, unique=True)
    category = models.ForeignKey(
        SkillCategory, default=None, null=True, blank=True
    )

    def __unicode__(self):
        return self.title


class UserProfile(models.Model):
    user = models.OneToOneField(User)
    skill = models.ManyToManyField(Skill)

    def __unicode__(self):
        return self.user.username

在我看来,我基本上获得了一套技能,用于在登录后填充UserProfile和模型:Skills

@login_required
def UpdateUserSkills(request):
    cleaned_skills = get_skill_list(user=request.user)

    user_profile, created = UserProfile.objects.get_or_create(
        user=request.user
    )

    for s in cleaned_skills:
        user_profile.skill.get_or_create(title=s)

    return HttpResponseRedirect(reverse('show_user_profile')) 

我的问题是 - 这种添加技能的方法是否尊重模型的独特约束,如果这样做,它是否不会为给定用户填充这些技能(如果它们已经存在)?做这样的事情可能会更好:

for s in cleaned_skills:
    skill = Skill.objects.get_or_create(title=s)
    user_profile.skill.get_or_create(title=skill)

尽管这似乎会产生双倍的数据库查询。

也许还有另一种更好的方法?

4

1 回答 1

1

你应该这样做:

for s in cleaned_skills:
    skill = Skill.objects.get_or_create(title=s)
    user_profile.skill.add(skill)

仅当不存在具有相同标题的技能时,才会创建该技能。然后它将技能添加给用户。

编辑:您可以保存一些查询,如果您执行bulk_create. 像这样的东西:

skill_titles = Skill.objects.values_list('title', flat=True)
new_skills = Skill.objects.bulk_create([Skill(title=s) for s in cleaned_skills if s not in skill_titles])
user_profile.skill.add(*new_skills)
于 2013-10-08T00:30:53.033 回答