То, как я создаю модель Django с ForeignKeys, который не располагается каскадом, удаляет его детям?

Чтобы избежать окрашивания фона ProgressBar, вы должны получить ссылку на точный точечный рисунок из внутреннего ProgressBar LayerDrawable. Это хакерский способ сделать это, но он работает.

LayerDrawable layerDrawable = (LayerDrawable) progressBar.getProgressDrawable();
Drawable drawable = layerDrawable.getDrawable(2); // The progress bitmap
drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
23
задан Andrey Fedorov 17 June 2009 в 10:07
поделиться

6 ответов

Ответ Гарольда указал мне правильное направление. Это набросок того, как я его реализовал (во французской устаревшей базе данных, отсюда несколько странное соглашение об именах):

class Factures(models.Model):
    idFacture = models.IntegerField(primary_key=True)
    idLettrage = models.ForeignKey('Lettrage', db_column='idLettrage', null=True, blank=True)

class Paiements(models.Model):
    idPaiement = models.IntegerField(primary_key=True)
    idLettrage = models.ForeignKey('Lettrage', db_column='idLettrage', null=True, blank=True)

class Lettrage(models.Model):
    idLettrage = models.IntegerField(primary_key=True)

    def delete(self):
        """Dettaches factures and paiements from current lettre before deleting"""
        self.factures_set.clear()
        self.paiements_set.clear()
        super(Lettrage, self).delete()
18
ответ дан 29 November 2019 в 01:25
поделиться

В диспетчере Django ForeignKey есть метод clear (), который удаляет все объекты из набора связанных объектов. Сначала вызовите это, а затем удалите ваш объект. Внешние ключи зависимых объектов будут иметь значение None (если это разрешено в вашей модели).

Краткое описание здесь: http://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward

7
ответ дан 29 November 2019 в 01:25
поделиться

Что ж, глядя на метод удаления

def delete(self):
    assert self._get_pk_val() is not None, "%s object can't be deleted because its %s attribute is set to None." % (self._meta.object_name, self._meta.pk.attname)

    # Find all the objects than need to be deleted.
    seen_objs = CollectedObjects()
    self._collect_sub_objects(seen_objs)

    # Actually delete the objects.
    delete_objects(seen_objs)

, я бы сказал, что переопределения удаления должно быть достаточно ... непроверенный код будет

def delete(self):
    assert self._get_pk_val() is not None, "%s object can't be deleted because its %s attribute is set to None." % (self._meta.object_name, self._meta.pk.attname)

    # Find all the objects than need to be deleted.
    seen_objs = CollectedObjects()
    seen_objs.add(model=self.__class__, pk=self.pk, obj=self, parent_model=None)

    # Actually delete the objects.
    delete_objects(seen_objs)
2
ответ дан 29 November 2019 в 01:25
поделиться

Один из способов - вызвать метод clear перед удалением, документация здесь , которая в основном «очищает» отношения. Одна проблемная мысль: это не авто само по себе. Вы можете выбрать: вызывать его каждый раз, когда вам не нужен каскад, или использовать сигнал pre_delete для отправки clear перед каждым удалением, конечно, это вызовет проблемы, когда вы ДЕЙСТВИТЕЛЬНО хотите удалить - каскад.

Или вы можете внести свой вклад в сообщество django и добавьте аргумент ключевого слова для удаления, может быть, он будет в django 1.3?: D

1
ответ дан 29 November 2019 в 01:25
поделиться

FYI - запрос на эту возможность существует в репозитории исходных текстов django по адресу http://code.djangoproject.com/ticket/7539. Похоже, что эта тема привлекает некоторое внимание. Надеемся, что она будет включена в будущие выпуски Django.

Тикет содержит исправления к ядру Django для реализации опционального параметра "on_delete" для models.ForeignKey(...), который позволяет указать, что произойдет при удалении указанной модели, включая выключение поведения по умолчанию ON DELETE CASCADE.

.
3
ответ дан 29 November 2019 в 01:25
поделиться

Re: http://code.djangoproject.com/ticket/7539

Нет внимания по состоянию на Django 1.2.1, июнь 2010. Я думаю, что нам нужно «следить за этим пространством».

0
ответ дан 29 November 2019 в 01:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: