2014-03-19 2 views
1

내 모델의 업데이트는 다음과 같다 수행합니다장고 관리자 대신 삽입

class Station(models.Model): 
    sid = models.IntegerField(primary_key=True) 
    uid = models.ForeignKey('User', db_column='uid', verbose_name='User') 
    name = models.CharField(max_length=100) 
    # and others...  
class Meta: 
    managed = False 
    db_table = 'Stations' 

class Playlist(models.Model): 
    plid = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=200) 
    changed = models.BooleanField(default = False) 
    def __unicode__(self): 
    return self.name 
    class Meta: 
     managed = False 
     db_table = 'Playlists' 

class Stationplaylist(models.Model): 
    spid = models.IntegerField(primary_key=True, db_column='spid') 
    sid = models.ForeignKey(Station, db_column='sid') 
    plid = models.ForeignKey(Playlist, db_column='plid') 
    syncronized = models.BooleanField() 
    def __unicode__(self): 
      return self.plid.name 
    class Meta: 
     managed = False 
     db_table = 'StationsPlaylists' 
     unique_together=('sid', 'plid') 

그리고 내보기에 삽입 작업을 수행 할 :

def addPlaylist(request, app_label='webadmin', **kwargs): 
    # stuff... 
    selected_playlists = request.POST.getlist('selected_playlists[]') 
    current_station = request.POST.get('station') 
    totalPlaylists = Stationplaylist.objects.filter(sid=current_station).count() 
    last_spid = None   
    for playlist in selected_playlists: 
     if playlist != 'on': 
      if totalPlaylists==0: 
       last_spid=1 
      elif last_spid == None: 
       last_obj = Stationplaylist.objects.order_by('-pk')[0] 
       last_spid = last_obj.spid + 1 
      else: 
       last_spid += 1 
      Stationplaylist(last_spid, current_station, playlist, 0).save() # 0-syncronized 
      totalPlaylists+=1 
    return HttpResponse('OK') 

을하지만이를 위해 호출 할 때, 역 말 # 1, 3 개의 재생 목록이 있고 다른 하나를 호출하면 2 번 스테이션이되도록합니다. 재생 목록은 간단히 업데이트됩니다. 내 말은, 데이터베이스에서 그들의 스테이션 필드가 스테이션 # 2로 업데이트된다는 것입니다.

왜 그런 일이 일어나고 어떻게 해결할 수 있습니까?

미리 감사

답변

0

에서 당신은 자동으로 기본 키를 무시하고 순수한 IntegerField했습니다. 이것은 자동 증가가 아니므로 새로운 인스턴스마다 동일한 기본 기본 키를 가져옵니다.

정말 좋은 이유가없는 한 자신의 기본 키 필드를 정의해서는 안됩니다. 하지만 그럴만한 이유가 있다면 IntegerField보다는 AutoField을 사용해야합니다.

+0

auto_increment를 시뮬레이트하기 위해 last_spid를 사용하고 있습니다. 링크를 제공해 주셔서 감사합니다. –

+0

Yuck, 방금 그 코드를 발견했습니다. 제발하지 마세요. 당신은 모든 종류의 끔찍한 경쟁 조건에 처해 있습니다. –

+0

좋아, 내가 필드를 AutoField로 바꿨을 때 p = Playlistsong (current_playlist, song, totalSongs + 1) p.save() 서버가 '내부 오류'를 반환합니다. 그 원인은 무엇입니까? –