Найти - Пользователи
Полная версия: Python implement OneToOneField & ForeignKey
Начало » Python для новичков » Python implement OneToOneField & ForeignKey
1
skoomer
Доброго времени суток.
Стоит задача потренироваться Python + sql
Хочу попробовать сделать минимальное подобие orm.
Начал с написания классов типов полей и отношений.
Есть классы Field, CharField etc..

у меня возникли трудности с их реализацией.

использовать алхимию и другие орм не хочу - это уже готовы орм, у меня задача другая.

вот пару примеров того что я сделал.

Я не знаю насколько это неправильно и не пойму как реализовать отношения ForeignKey and OneToOneField
валидации пока не делаю.
Подскажите что не правильно, что дописать а что убрать.особенно важен момент с отношениями

дальше буду через форматирование строк в sql вставлять значения и делать таблицы,строки.
пока все работает кроме отношений

 class Field(object):
    def __init__(self, name, column_type, primary_key, default):
        self.name = name
        self.column_type = column_type
        self.primary_key = primary_key
        self.default = default
    def __str__(self):
        return '<%s, %s, %s>' % (self.__class__.__name__, self.column_type, self.name)
class VarcharField(Field):
    def __init__(self,  name=None, primary_key=False, default=None, ddl='varchar(100)', max_len=4):
        super(VarcharField, self).__init__(name, ddl, primary_key, default)
        self.max_len = max_len
        self.field_type_sql = f'VARCHAR'
class OneToOneField(Field):
    def __init__(self, rel_class, name=None):
        super(OneToOneField, self).__init__(
            name, primary_key=False, default=0, column_type=None
        )
        self.rel_class = rel_class
class ForeignKey(Field):
    def __init__(self, model_class, name=None):
        self.column_type = "foreignkey"
        self.field_level = 1
        self.name = name
        self.model_class = model_class
    def field_sql(self, field_name):
        foreign_to = self.model_class.__name__.lower()
        return '"%s" integer NULL REFERENCES "%s" ("id")' % (field_name, foreign_to)
FishHook
skoomer
у меня возникли трудности с их реализацией.
из вашего кода совершенно невозможно понять, какие именно трудности и с чем

skoomer
Я не знаю насколько это неправильно
Мне кажется, вы не с того начали. У вас же не вполне прикладная задача, где есть условие и результат, вы разрабатываете фреймворк. То есть ваш код будет многократно переиспользоваться и задача сделать это переиспользование максимально практичным. Вот с этого и надо начать. Надо сначала придумать как это будет использоваться, безо всякой реализации. Встаньте на сторону пользователя вашего фреймворка, накидайте примеров, как будут выглядеть модели, как будут строиться запросы, как извлекаться данные, как сущности будут обновляться, создаваться и удаляться, как работать с транзакциями и пр. А потом, имея представление о том, что надо реализовать, можно приступать к реализации.

Например, я придумал вот такой фреймворк
 @model(models.ID_MODEL)
class Person:
    @field(fields.STRING, empty=True)
    def name(self, val: str) -> str:
          pass   
    @field(fields.INT, null=False)
    def age(self, val: int) -> int:
          assert(10 < val < 150)
@model(models.ID_MODEL)
class Organization:
    @field(fields.STRING, empty=False, unique=True)
    def name(self, val: str) ->str:
          pass  
    
    @field(fields.ONE_TO_MANY, rely_to=Person) 
    def staff(self, val: Iterable[Person]) -> List[Person]:
         pass
with transaction() as t:
    person = new(Person)
    person.name = 'Ivan'
    person.age = 43
    organization = find_one(Organization).where(name='Vector')
    organization.staff.add(person)

теперь можно пробовать реализовать задумку. А что вы пытаетесь воплотить в коде?
skoomer
FishHook
Мне кажется, вы не с того начали. У вас же не вполне прикладная задача, где есть условие и результат, вы разрабатываете фреймворк. То есть ваш код будет многократно переиспользоваться и задача сделать это переиспользование максимально практичным. Вот с этого и надо начать. Надо сначала придумать как это будет использоваться, безо всякой реализации. Встаньте на сторону пользователя вашего фреймворка, накидайте примеров, как будут выглядеть модели, как будут строиться запросы, как извлекаться данные, как сущности будут обновляться, создаваться и удаляться, как работать с транзакциями и пр. А потом, имея представление о том, что надо реализовать, можно приступать к реализации.

Конкретно сейчас хочу узнать как написать классы - один к одному и один ко многим FK & onetoone

Надо сначала придумать как это будет использоваться, безо всякой реализации. Встаньте на сторону пользователя вашего фреймворка, накидайте примеров, как будут выглядеть модели, как будут строиться запросы, как извлекаться данные, как сущности будут обновляться, создаваться и удаляться, как работать с транзакциями и пр.

это будет использоваться только в учебных целях .Насчет запросов и транзакций , буду использовать адаптер psycopg2 , функции для создание таблиц , или просто вручную писать sql и через форматирование строк вставлять значения.

Пока что меня волнует как должны выглядеть базовые классы которые описывают тип полей.
FK & onetoone с этим затрудняюсь
FishHook
Да как угодно они могут выглядеть, нет же никакого стандарта.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB