Фильтр данных модели Django - PullRequest
0 голосов
/ 28 марта 2019

Это первоначальная попытка настроить некоторые базовые функции CRUD для существующей базы данных (на основе SQL Server) для внутреннего приложения Django. Я хотел бы получить совет по определению модели, которая будет поддерживать первичную таблицу, которая содержит список торговых партнеров, а также определяет тип партнера. Партнер может иметь несколько типов. Например, Заказчик также может быть Поставщиком. Затем существует связанная таблица PartnerTypes, которая содержит некоторые дополнительные сведения, но в первую очередь текстовое описание / имя, присвоенное типу партнера.

Когда я использовал команду inspectdb из Django, я получил то, что можно было ожидать, и ForeignKeys были настроены в модели.

Я хотел бы знать, возможно ли включить некоторый тип «фильтрации» в класс модели для использования одной и той же таблицы в разных классах.

Например, создайте класс модели для клиента (например, Client_Partner), а затем еще один для поставщика (например, Supplier_Partner), чтобы они оба указывали на одну и ту же базовую таблицу Partner, и в то же время позволяли создавать отдельную форму для каждого «Тип» партнера?

Во время создания нового клиента тогда TypeID должен быть предварительно заполнен соответствующим TypeId.

Я понимаю, что может быть более уместно не использовать интерфейс администратора, но, поскольку я новичок в Django, и это внутренний проект, я подумал, что можно было бы «начать работу» и заставить некоторые данные идти против набор в основном статических таблиц основных данных.

Заранее спасибо (Боюсь, я лучше учусь на примерах, поэтому, прочитав много постов и некоторые документы, я все еще чувствую себя потерянным без чего-то, чему я могу следовать в виде базового примера)

Пример таблицы данных (в этом случае компания A является одновременно клиентом и поставщиком)


+--------+-----------------------+---------+
| TypeID | Type                  | Code    |
+--------+-----------------------+---------+
| 0      | Parent                | PARENT  |
| 1      | Client                | CLI     |
| 2      | Supplier              | SUPP    |
+--------+-----------------------+---------+

+-----------+--------------------+--------+-----------+
| PartnerID | name               | TypeID | Code      |
+-----------+--------------------+--------+-----------+
| 1         | Our Company        | 0      | US        |
| 10        | Company A          | 1      | CA        |
| 20        | Company A          | 2      | CA        |
| 30        | Company B          | 2      | CB        |
+-----------+--------------------+--------+-----------+

Генерируемая модель Django

class Trading_Partner(models.Model):
    partnerid = models.IntegerField(db_column='PartnerID', primary_key=True) 
    code = models.CharField(db_column='Code', max_length=10, blank=True, null=True)
    name = models.CharField(db_column='Name', max_length=150, blank=True, null=True)
    typeid = models.ForeignKey('Trading_Partner_Type', models.DO_NOTHING, db_column='TypeID', blank=True, null=True)
    lei = models.CharField(db_column='LEI', max_length=20, blank=True, null=True) 

    class Meta:
        managed = False
        db_table = 'Partner'


class Trading_Partner_Type(models.Model):
    typeid = models.IntegerField(db_column='TypeID', primary_key=True)
    type = models.CharField(db_column='Type', max_length=50, blank=True, null=True)
    code = models.CharField(db_column='Code', max_length=20, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'PartnerType'

1 Ответ

0 голосов
/ 28 марта 2019

Чтобы различать разных типов партнеров, вы можете использовать модели прокси .

class PartnerManager(models.Manager):
    def __init__(self, partner_type):
        super().__init__()
        self.partner_type = partner_type

    def get_queryset(self):
        return super().get_queryset().filter(typeid=self.partner_type)

class Client_Partner(Trading_Partner):
    objects = PartnerManager(1)
    class Meta(Trading_Partner.Meta):
        proxy = True

class Parent_Partner(Trading_Partner):
    objects = PartnerManager(0)
    class Meta(Trading_Partner.Meta):
        proxy = True

class Supplier_Partner(Trading_Partner):
    objects = PartnerManager(2)
    class Meta(Trading_Partner.Meta):
        proxy = True

Но я не знаю, возможно ли это с неуправляемыми моделями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...