Как я могу получить некоторые преимущества Django ORM от использования ForeignKey без его использования? - PullRequest
1 голос
/ 31 августа 2011

У меня есть модели, которые выглядят так (упрощенно, конечно):

class Product(models.Model):
    product_code = Charfield(max_length=30)

class Change(models.Model):
    product = ForeignKey(Product)

Моя проблема в том, что это не сработает, потому что Продукты удаляются, но мне нужна ссылка в Изменении, чтобы остаться (использование on.delete, чтобы установить его в null, не вариант). Поэтому я переключил его на:

class Change(models.Model):
    product = CharField(max_length=30)

Но теперь я потерял преимущества поля «Внешний ключ» при запросах. Когда я запрашиваю изменение, я не могу выбрать «продукты» или выполнить какое-либо другое действие типа соединения, не углубляясь в предложения типа extra.

Итак, мой вопрос, есть ли какой-нибудь хороший способ съесть мой пирог и съесть его тоже? Чтобы можно было легко выйти на поле, но разве это не ФК? Похоже, что, кроме типа FK, должен быть какой-то способ сказать, что поля связаны между собой. Возможно через менеджера?

Ответы [ 2 ]

0 голосов
/ 31 августа 2011

Вы можете добавить логический флаг deleted к модели Product.Если вы хотите «удалить» продукт, установите product.deleted=True вместо удаления из базы данных.Это позволит вам использовать обычный внешний ключ от Change до Product.

Я не знаю, подойдет ли это для вашего проекта.Возможно, вам придется изменить довольно много кода, например, заменить Product.objects.all() на Product.objects.exclude(deleted=True).Создание менеджера, в котором набор запросов возвращает не удаленные элементы, поможет.

class Product(models.Model):
    product_code = Charfield(max_length=30)
    deleted = BooleanField(blank=True, null=True)

class Change(models.Model):
    product = ForeignKey(Product)
0 голосов
/ 31 августа 2011

У меня есть именно эта проблема под рукой ... к сожалению, ее настоятель был разбит довольно далеко в моем списке.Однако я считаю, что на самом деле я использовал поле «многие ко многим», чтобы сохранить ссылку в другой части моего приложения.Использование поля «многие ко многим», кажется, решает все проблемы, с которыми я столкнулся.Смотрите мои упрощенные модели ниже.

С этой настройкой я могу:

  • Создать карту и привязать к ней несколько Card_Tests (обратите внимание, что могут быть дубликаты)
  • Изменить илиУдалите один или все Card_Tests без удаления записи Карты.
  • Удалите все Card_Tests, удалив запись Карты.

Модель карты

class Card(models.Model):
    serial_number = models.CharField(max_length=25)
    card_tests = models.ManyToManyField('Card_Test', through='Card_Test_List')

Через модель

class Card_Test_List(models.Model):
    card_id = models.ForeignKey('Card')
    card_test_id = models.ForeignKey('Card_Test')
    result       = models.TextField()

Тестовая модель карты

class Card_Test(models.Model):
    name = models.TextField(max_length=100)
    description = models.TextField(max_length=200)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...