да я понимаю. В общем дела такие, что м2м поле не дает возможности связывать несколько объектов. Т.е. работает просто как FK.Повторюсь:Есть модель Task, она расширяется через о2о другой моделью - Gantt. Модель Gantt, кроме прочих полей, имеет м2м поле(predecessors) на модель Task. И вот это predecessors работает только как обычное FK-поле. Толи я дурак и не вижу свою ошибку, толи хз...модели:
class Task(ModelChangedData, models.Model):
user = models.ForeignKey(User, blank=True, null=True)
shot = models.ForeignKey('shots.Shot')
task_type = models.ForeignKey(Task_type)
desc = models.TextField(blank=True, null=True)
status = models.ForeignKey(Status)
bid_hours = models.IntegerField()
baseline_start = models.DateTimeField(blank=True, null=True)
baseline_finish = models.DateTimeField(blank=True, null=True)
class Meta:
verbose_name = 'Task'
verbose_name_plural = 'Tasks'
class Gantt(models.Model):
task = models.OneToOneField(Task)
indentation = models.SmallIntegerField(default=1)
start = models.DateTimeField(blank=True, null=True)
finish = models.DateTimeField(blank=True, null=True)
completed_finish = models.DateTimeField(blank=True, null=True)
is_milestone = models.BooleanField(default=False)
is_completed = models.BooleanField(default=False)
predecessors = models.ManyToManyField(Task, related_name='pre_task', blank=True, null=True)
load = models.SmallIntegerField(blank=True, null=True)
вот полная вьюха, которая обрабатывает запрос
@login_required
def set_gantt_property(request):
error = {}
if request.method == 'POST' and request.is_ajax():
if 'id' in request.POST and 'type' in request.POST:
t = Gantt.objects.get_or_create(task_id = request.POST['id'])
g = t[0]
if 'finish' in request.POST and 'start' in request.POST:
g.start = datetime.datetime.fromtimestamp(float(request.POST['start']))
g.finish = datetime.datetime.fromtimestamp(float(request.POST['finish']))
if 'isMilestone' in request.POST:
g.is_milestone = request.POST['isMilestone']
if 'completedFinish' in request.POST:
g.completedFinish = datetime.datetime.fromtimestamp(float(request.POST['completedFinish']))
if 'assignmentsContent' in request.POST:
try:
tsk = Task.objects.get(pk = g.task_id)
tsk.user = User.objects.get(username__iexact = request.POST['assignmentsContent'])
except User.DoesNotExist:
error.update({'error':'User does not exist.'})
except Task.DoesNotExist:
error.update({'error':'Task does not exist.'})
else:
tsk.save()
if 'successor' in request.POST:
try:
tsk = Task.objects.get(pk = request.POST['successor'])
except Task.DoesNotExist:
error.update({'error':'Task does not exist.'})
else:
#g.predecessors.add(tsk)
tsk.pre_task.add(g)
else:
g.save()
if error:
return HttpResponseForbidden('[{"error":"Forbidden. Something went wrong."}]', mimetype='application/json; charset=utf8')
return HttpResponse('[{"success":"true"}]', mimetype='application/json; charset=utf8')
return HttpResponseForbidden('[{"error":"Forbidden. Wrong headers."}]', mimetype='application/json; charset=utf8')