2013-10-08 4 views
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) 

이것은 DB 쿼리의 수를 두 배로 늘리는 것처럼 보일 수 있지만 보이지는 않습니다.

아마도 다른 방법이 있을까요?

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

같은 제목의 기술이 이미 존재하지 않는 경우에만 기술을 생성합니다 :

답변

1

은 당신이 뭔가를 할 것이다. 그런 다음 스킬을 사용자에게 추가합니다.

편집 : 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) 
+0

대단한 답변에 감사드립니다. 두 가지 가능한 솔루션에 대한 추가 표시입니다. Django 디버그 도구 모음은 쿼리가 정확히 같은 숫자가되도록 동시에보고합니다. 그래서 좀 더 읽기 쉽기 때문에 첫 번째 솔루션을 구현할 것입니다. –