2012-02-28 5 views
0

셀시주기 태스크의 필드를 미리 채우는 데 사용되는 rsync 구성처럼 작동하는이 간단한 모델이 있습니다. 처음으로 새로운 rsync 설정 물마루를 만들면 모든 것이 정상이며 새로운 주기적 작업이 문제없이 생성됩니다. 내가 시도하고 작업 인수와 같은 작업 필드를 변경하는 특정 필드를 변경하면 "IntegrityError 열 이름이 고유하지 않습니다"나는 그것이 모델 저장 방법과 관련이 있다고 생각하지만 어떻게해야할지 모르겠다. 알았어. 누구 한테 아이디어가 있니? 여기 Django-Celery IntegrityError 고유하지 않은 열 이름

는 모델 :

from django.forms import ModelForm 
from djcelery.models import IntervalSchedule 
from djcelery.models import PeriodicTask, IntervalSchedule 
INTERVAL=(
    ('every=5','period 5 minutes'), 
    ) 

class Customer(models.Model): 
    """(Customer description)""" 
    customername = models.CharField(blank=True, max_length=30) 
    emailaddress = models.EmailField() 
    phonenumber = models.CharField(blank=True, max_length=10) 
    class Meta: 
    verbose_name_plural = "Customer" 
    def __unicode__(self): 
     return self.customername 

class RsyncConfig(models.Model): 
    """(RsyncConfig description)""" 
    cname = models.ForeignKey(Customer) 
    rsyncname = models.CharField(blank=True, max_length=255) 
    interval=models.CharField(max_length=8,choices=INTERVAL) 
    fromip = models.IPAddressField(blank=True) 
    source_dir = models.CharField(blank=True, max_length=255) 
    destination_dir = models.CharField(blank=True, max_length=255) 
    rsync_args = models.CharField(blank=True, max_length=255) 

    class Meta: 
     verbose_name_plural = "Rsync Config" 

    def __unicode__(self): 
     return self.cname.customername 

그리고 여기 admin.py 양식입니다.

from django.contrib import admin 
from django import forms 
from djcelery.models import PeriodicTask, IntervalSchedule 
from newrsync.models import Customer,RsyncConfig 

class CustomerAdmin(admin.ModelAdmin): 
    class Meta: 
     model = Customer 

class RsyncConfigAdminForm(forms.ModelForm): 
    list_display = ('customername', 'rsyncname','source_dir','destination_dir') 
    class Meta: 
     model = RsyncConfig 

    def __init__(self, *args, **kwargs): 
     super(RsyncConfigAdminForm,self).__init__(*args, **kwargs) 

    def save(self, commit=True): 
     interval = IntervalSchedule.objects.get(every=5,period="minutes") 
     model = super(RsyncConfigAdminForm, self).save(commit = False) 
     model.cname = self.cleaned_data['cname'] 
     model.rsyncname = self.cleaned_data['rsyncname'] 
     model.fromip = self.cleaned_data['fromip'] 
     model.source_dir = self.cleaned_data['source_dir'] 
     model.destination_dir = self.cleaned_data['destination_dir'] 
     model.rsync_args = self.cleaned_data['rsync_args'] 
     if commit: 
      model.save() 
     PeriodicTask.objects.get_or_create(
       interval=interval, 
       task='apps.mftconfig.tasks.rsync_proc', 
       args=['rsync', 
        model.rsync_args, 
        model.source_dir, 
        model.destination_dir], 
       kwargs = {}, 
       name = (model.cname," ",model.rsyncname), 
       enabled=False 
       ) 
     return model 


class RsyncConfigAdmin(admin.ModelAdmin): 
    form = RsyncConfigAdminForm 
    list_display = ('cname', 'rsyncname','source_dir','destination_dir') 


admin.site.register(Customer,CustomerAdmin) 
admin.site.register(RsyncConfig,RsyncConfigAdmin) 
+0

0) 들여 쓰기를 save()에서 수정하고 1) django 쉘에서 문제를 재현하고 쉘 세션 + 추적을 붙여 넣을 수 있습니까? – jpic

+0

안녕하세요 jpic, 신빙성이 좋아 보입니까? 그리고 셸의 문제를 재현하여 무슨 뜻인지 확실하지 않습니다. 그것은 형식입니다, 그리고 양식없이 그것을 재현하는 방법을 모르겠습니다? – Daxomatic

+0

양식없이 양식을 재현하십시오. 양식 RsyncConfigAdminForm (데이터 = {...})로 시도하십시오 – jpic

답변

0

나는 기본적으로 내가 새로운 version.It이 완벽 하진 저장하기 직전 개체의 삭제하고 결국하지만 적어도 난의가 나를 물지 않을 희망하자 고유 이제 PeriodicTask 모델에서 억제 및 우회 나중에 엉덩이에. 누구든지 제안 사항이 있으면 알려주세요. ;-)

class RsyncConfigAdminForm(forms.ModelForm): 
    list_display = ('customername','rsyncname','source_dir','destination_dir') 
class Meta: 
    model = RsyncConfig 

def __init__(self, *args, **kwargs): 
    super(RsyncConfigAdminForm,self).__init__(*args, **kwargs) 

def save(self, commit=True): 

    instance = super(RsyncConfigAdminForm, self).save(commit = False) 
    instance.customername = self.cleaned_data['customername'] 
    instance.rsyncname = self.cleaned_data['rsyncname'] 
    instance.fromip = self.cleaned_data['fromip'] 
    instance.source_dir = self.cleaned_data['source_dir'] 
    instance.destination_dir = self.cleaned_data['destination_dir'] 
    instance.rsync_args = self.cleaned_data['rsync_args'] 
    interval = IntervalSchedule.objects.get(every=5,period="minutes") 
    p=PeriodicTask.objects.filter(name=instance.rsyncname) 
    p.delete() 
    PeriodicTask.objects.get_or_create(
      interval=interval, 
      task='apps.mftconfig.tasks.rsync_proc', 
      args=['rsync', 
       instance.rsync_args, 
       instance.source_dir, 
       instance.destination_dir], 
      kwargs = {}, 
      name = (instance.rsyncname), 
      enabled=True 
      ) 
    if commit: 
     instance.save() 
    return instance 
관련 문제