簡體   English   中英

在python庫中使用Django ORM會造成麻煩嗎?

[英]Will using the Django ORM in a python library cause trouble?

這些年來,我很喜歡使用Django。 現在我正在為一家正在建立一些共享內部庫的公司工作,以便從我們的數據庫中訪問信息。 現在事情非常草率 - 許多內聯SQL代碼。 一些同事正在努力做一些訪問代碼,我發現這是我習慣於Django開箱即用的東西。 我還聽說Django基本上是模塊化的,因此我可以單獨使用ORM系統。 我知道還有像SqlAlchemy這樣的其他軟件包,但我也聽說Django對普通情況更容易,這可能是我們所需要的。 我也知道Django,不知道SQLAlchemy。

所以,我可以做一個概念證明,如下所示。 這是目錄結構:

+-- example.py
+-- transfer
|   +-- __init__.py
|   +-- models.py

這是models.py

import django.conf
import django.db.models

django.conf.settings.configure(
    DATABASES = ..., # database info
    INSTALLED_APPS = ("transfer",),
    SECRET_KEY = 'not telling',
)
django.setup()

class TransferItem(django.db.models.Model)
    # model info here

example.py

from transfer.models import TransferItem
items = TransferItem.objects.all()
print items

就目前而言,這似乎工作得很好。 但我擔心庫上下文中的引導代碼。 特別:

  1. django認為這是一個應用程序有危險嗎? 在這種情況下,“transfer”是一個根模塊,但在庫上下文中,這可能會深埋。 例如,“mycompany.data.protocols.transfer”。 從理論上講,我們可以在整個代碼庫中定義這些數據模型。 這個“應用程序列表”如何擴展?
  2. 設置的呼吁真的讓我擔心。 django docs特別說只調用一次setup。 然而,庫的本質是任何python應用程序都可以導入他們想要的任何類型的數據模型。 我無法假設他們可能想要哪些django“apps”,或者他們想要它們的順序。如果使用一種類型的模型,則返回數據,然后只有python應用程序決定它需要導入另一種模型(很可能在不同的“app”中)?

所以,根本問題是:

有沒有在python庫中使用django ORM的好方法?

編輯:不是 CLI工具問題的副本。 我知道如何在Web服務器外運行django。 我甚至給出了代碼示例。 我想知道是否有辦法運行django,我本身沒有“apps” - 模型文件可以通過客戶端代碼導入並以任何順序使用。

好的,這是我自己嘗試在經過一些研究后回答這個問題。

我可以在庫中的任何位置為我的模型創建一個基類,如下所示:

from django.db import models
from django.apps import apps
import django.conf

django.conf_settings.configure(
    DATABASES = ...
)

apps.populate((__name__,))

class LibModel(models.Model):
    class Meta:
        abstract = True
        app_label = __name__

然后在庫中的任何地方我都可以使用這個基類創建自己的模型。 由於我不依賴於數據庫名稱的“app”,我需要明確說明它們。

class SpecificModel(LibModel):
    # fields go here
    class Meta(LibModel.Meta):
        db_table = "specific_model_table_name"

這讓我擔心必須模擬“app”的結構。 基類中的name屬性為Django提供了所有需要的東西,然后Django放棄了抱怨沒有找到應用程序。 其他模型文件可以在任何他們想要的地方生活。

但是,我仍然有一個可能致命的問題。 Django的初始化本身仍然是單例。 如果我的庫本身是由Django應用程序導入的,它將全部崩潰並燒毀。 我在這個后續問題中要求解決這個問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM