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 и вставить сеанс оболочки + traceback. – jpic

+0

Привет jpic, идентификация кажется прекрасной? и я не уверен, что вы подразумеваете, воспроизведя проблему в оболочке. Это форма, и я не уверен, как воспроизвести ее без формы? – Daxomatic

+0

Попробуйте воспроизвести его без формы. Попробуйте с формой RsyncConfigAdminForm (data = {...}) – 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 

 Смежные вопросы

  • Нет связанных вопросов^_^