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)

これは、2 倍の数の DB クエリを生成するように見えますが。

おそらく、別のより良い方法がありますか?

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 に答える