यहाँ एक पूर्ण उदाहरण annotate()
function और एक Concat
expression के आधार पर फ़िल्टर करने के लिए कैसे पता चलता है कि है।
# Tested with Django 1.9.2
import sys
import django
from django.apps import apps
from django.apps.config import AppConfig
from django.conf import settings
from django.db import connections, models, DEFAULT_DB_ALIAS
from django.db.models.base import ModelBase
from django.db.models.functions import Concat
NAME = 'udjango'
def main():
setup()
class Item(models.Model):
series = models.CharField(max_length=50)
number = models.CharField(max_length=50)
syncdb(Item)
Item.objects.create(series='A', number='1234')
Item.objects.create(series='A', number='1230')
Item.objects.create(series='A', number='9999')
Item.objects.create(series='B', number='1234')
print(Item.objects.annotate(
search=Concat('series', 'number')).filter(
search__icontains='A123').values_list('series', 'number'))
# >>> [(u'A', u'1234'), (u'A', u'1230')]
def setup():
DB_FILE = NAME + '.db'
with open(DB_FILE, 'w'):
pass # wipe the database
settings.configure(
DEBUG=True,
DATABASES={
DEFAULT_DB_ALIAS: {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': DB_FILE}},
LOGGING={'version': 1,
'disable_existing_loggers': False,
'formatters': {
'debug': {
'format': '%(asctime)s[%(levelname)s]'
'%(name)s.%(funcName)s(): %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S'}},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'debug'}},
'root': {
'handlers': ['console'],
'level': 'WARN'},
'loggers': {
"django.db": {"level": "WARN"}}})
app_config = AppConfig(NAME, sys.modules['__main__'])
apps.populate([app_config])
django.setup()
original_new_func = ModelBase.__new__
@staticmethod
def patched_new(cls, name, bases, attrs):
if 'Meta' not in attrs:
class Meta:
app_label = NAME
attrs['Meta'] = Meta
return original_new_func(cls, name, bases, attrs)
ModelBase.__new__ = patched_new
def syncdb(model):
""" Standard syncdb expects models to be in reliable locations.
Based on https://github.com/django/django/blob/1.9.3
/django/core/management/commands/migrate.py#L285
"""
connection = connections[DEFAULT_DB_ALIAS]
with connection.schema_editor() as editor:
editor.create_model(model)
main()
स्रोत
2016-04-15 17:33:16
जवाब के लिए धन्यवाद उपयोग कर रहा है, दुर्भाग्य से मैं Django 1.3 उपयोग कर रहा हूँ इसलिए कोई Concat परिभाषित किया गया है। मैंने इसे यहां वर्णित करने की कोशिश की: http://stackoverflow.com/questions/4348124/django-orm-filter-by-extra-attribute/4348728#4348728 लेकिन मुझे कुछ त्रुटियां मिलती हैं और मैं इसे भी ऐसा करने में थक गया : चालान = invoices.extra ( जहां = [ 'concat (document_series_name, document_number) की तरह "% F001%"'], ) लेकिन मैं एक ही मिली त्रुटियाँ मिल गया: सीमा से बाहर टपल सूचकांक /usr/स्थानीय/lib/python2.7/dist-packages/django/db/backends/postgresql_psycopg2/exec.py निष्पादित करें, लाइन 44 –
वैसे यह एक संस्करण संख्या है जिसे मैंने थोड़ी देर में नहीं सुना है ... दस्तावेज़ अब और भी उपलब्ध नहीं है ! मुझे लगता है कि आप किसी भी कारण से अपग्रेड नहीं कर सकते हैं - भले ही आपको वास्तव में सुरक्षा कारणों से कम से कम करना चाहिए। वैसे भी, आपकी सबसे अच्छी शर्त शायद कच्चे एसक्यूएल लिख रही है, शायद जांचें कि 'एफ()' एक्सप्रेशन फिर भी उपलब्ध थे या नहीं। – mccc
धन्यवाद, मैं कोशिश करूंगा, उत्तर अभी भी मान्य है, धन्यवाद –