Как продлить Django стороннюю модель? - PullRequest
2 голосов
/ 04 февраля 2020

Я использую Python 3.7, Django 2.0 и модуль django -адрес == 0.2.1 (https://pypi.org/project/django-address/). Кажется, что адресный модуль автоматически создает миграции и импортирует модели для моего приложения. Я хотел бы создать метод

def get_by_natural_key(self, name):
    return self.get_or_create(...fields...)[0]

для модели AddressField (для упрощения создания данных YAML). Можно ли добавить это в модель AddressField, не изменяя файлы ядра, которые загружаются при установке этого приложения? Таблица MySQL, созданная для этой модели, имеет вид

+
| address_address | CREATE TABLE `address_address` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `street_number` varchar(20) COLLATE utf8_bin NOT NULL,
  `route` varchar(100) COLLATE utf8_bin NOT NULL,
  `raw` varchar(200) COLLATE utf8_bin NOT NULL,
  `formatted` varchar(200) COLLATE utf8_bin NOT NULL,
  `latitude` double DEFAULT NULL,
  `longitude` double DEFAULT NULL,
  `locality_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `address_address_locality_id_5dd79609_fk_address_locality_id` (`locality_id`),
  CONSTRAINT `address_address_locality_id_5dd79609_fk_address_locality_id` FOREIGN KEY (`locality_id`) REFERENCES `address_locality` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+-----------------+-------------------------------------

, хотя не уверен, насколько эта структура таблицы имеет отношение к моему вопросу.

1 Ответ

0 голосов
/ 09 февраля 2020

Во-первых, я думаю, что вы хотите get_by_natural_key функционировать в менеджере модели, а не в самой модели. Чтобы он был доступен, например, Address.objects.get_by_natural_key.

Для этого вы можете выполнить * 1005. *

from django.db import models

class CustomManager(models.Manager):
    def get_by_natural_key(self, name):
        return self.get_or_create(...fields...)[0]

Address.add_to_class('objects', CustomManager())

...