Как вы ссылаетесь на имя класса Django в функцию? - PullRequest
0 голосов
/ 02 июля 2018

Я написал функцию, которая возвращает строку вставки для одного класса в Django, которая моделирует и отображает таблицу в FileMaker.

@staticmethod
def get_insert_string():
    fields = []
    arguments = []
    for field in Owner._meta.fields:
        if field.primary_key:
            pass
        elif field.help_text:
            fields.append('"%s"' % field.help_text)
            arguments.append('?')
    result = 'insert into %s ( %s ) values ( %s )' % ( Owner.filemaker_table_name, u','.join(fields), u','.join(arguments)) 
    return result 

Пример вывода.

Owner.get_insert_string()

u'insert в владельца ("uuid", "ABN_number", "Address_1", "Creation_Date", "Creation_Time", "Creation_User", "Creation_timestamp", "Date_started", "Modification_timestamp", "State", "" Пригород», "account_code", "account_name", "ACCOUNT_NUMBER", "authorised_officer_first_name", "authorised_officer_signature", "authorised_officer_surname", "BANK_NAME", "BSB", "company_name", "company_use_as_address", "crn_number", "discount_percent" "driver_or_staff", "факс", "is_driver", "is_staff", "jp_name", "jp_number", "jp_signature", "стационарный", "мобильный", "oa_number", "owner_1_first_name", "owner_1_middle_name",» имя_собственного_пользователя "," имя_собственника_2_производителя "," имя_собственника_2_получателя "," имя_собственника_2_представителя "," имя_представителя_3_представителя_представления "," имя_собственника_3_предприятия_клиента "," платное_произведение "," имя_составщика_покупки ", статус_запасов_доставок", статус_запасов "," статус_данных_представителей "," статус_данных_представителей "," статус_данных_представителей "," статус_данных_пользователей "," статус_данных_пользователей "," статус_доставок "," статус_в_плате "," статус_собственника "," статус_докладчика "," код_пакета "," статус "," заказ " "," taxable "," taxable_export "," тридцатидневный_аккаунт "," trade_retail_for_parts_cost "," tsl_number "," tsl_owner "," updated_date ") (?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ) '

Как это можно изменить, чтобы передать имя класса и получить те же результаты, чтобы функцию можно было использовать для всех классов в модуле?

Что-то вроде

def get_insert_string(class_name):
    fields = []
    arguments = []
    for field in class_name._meta.fields:
        if field.primary_key:
            pass
        if field.help_text:
            fields.append('"%s"' % field.help_text)
            arguments.append('?')
    result = 'insert into %s ( %s ) values ( %s )' % ( class_name.filemaker_table_name, u','.join(fields), u','.join(arguments)) 
    return result 

где class_name отображается в соответствующий класс Django.

1 Ответ

0 голосов
/ 03 июля 2018

Обнаруженные глобалы () в основном покрывают его.

Пример функции.

def get_insert_string(class_reference):
    fields = []
    arguments = []
    for field in class_reference._meta.fields:
        if field.primary_key:
            pass
        elif field.help_text:
            fields.append('"%s"' % field.help_text)
            arguments.append('?')
    result = 'insert into %s ( %s ) values ( %s )' % ( class_reference.filemaker_table_name, u','.join(fields), u','.join(arguments)) 
    return result 

Пример вызова:

depot_maestro.models.get_insert_string(globals()['DriverShiftPreference'])

Пример результатов:

insert into driver_shift_preferences ( "DEPOT_ID","driver_id","roster_template_id","roster_template____shift_slot_id","vehicle_id","uuid","commission_percentage","drive_name_lookup","lease_fee","levy_1","levy_2","linked_to_id","note","selected","shift_slot","week_id","creation_account_name","created_timestamp","modification_account_name","modification_timestamp" ) values ( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? )'

Остается только вопрос, как ссылаться на класс, в котором одинаковое имя класса существует в разных модулях.

...