Django GenericForeignKey удаляется, когда он не должен - PullRequest
0 голосов
/ 15 января 2020

У меня проблема с тем, что если я удаляю объект, другой объект удаляется, по-видимому, неправильно.

models.py

class Document(models.model):
    file = models.FileField(upload_to=document_path, null=True, max_length=256)
    ri_ct = models.ForeignKey(
        ContentType, null=True, editable=False, related_name='documents_related_item', on_delete=models.PROTECT
    )
    ri_id = models.PositiveIntegerField(null=True, editable=False, db_index=True)
    related_item = GenericForeignKey('ri_ct', 'ri_id')


class Invoice(models.model):
    documents = GenericRelation(
        Document, related_query_name='invoices', content_type_field='ri_ct', object_id_field='ri_id'
    )


class BalanceUpdate(models.model):
    related_item_ct = models.ForeignKey(
        ContentType,
        limit_choices_to=Q(app_label='main', model__in=('proformainvoice', 'invoice')),
        related_name='balance_updates',
        null=True,
        on_delete=models.PROTECT,
    )
    related_item_id = models.PositiveIntegerField(null=True, blank=True, db_index=True)
    related_item = GenericForeignKey(ct_field='related_item_ct', fk_field='related_item_id')

Теперь, если я делаю

Invoice.objects.filter(query).delete()

, я получаю BalanceUpdate, который связан с Invoice, также удаляется.

После значительной суммы отладки я обнаружил, что при удалении Invoice, документ удаляется ( правильно из-за определенного GenericRelation ).

Если мы посмотрим на Collector.collect , у нас есть рекурсивная функция, которая собирает объекты для удалено.

Если я вставлю сюда печать , когда моделью является Document, sub_ob js содержит объект BalanceUpdate. Как это может быть так? Документ обязательно должен иметь sub_ob js, содержащий BalanceUpdate, они, по-видимому, не связаны?

Заранее спасибо.

...