문제

Django 모델에 일부 데이터를 저장해야 합니다.이러한 데이터는 모델의 모든 인스턴스와 동일하지 않습니다.

처음에는 모델을 서브클래싱하는 것에 대해 생각했지만 애플리케이션을 유연하게 유지하려고 노력하고 있습니다.하위 클래스를 사용하면 새로운 종류의 개체가 필요할 때마다 전체 클래스를 만들어야 하는데 이는 좋지 않습니다.또한 한 쌍의 추가 필드를 저장하기 위해 많은 하위 클래스를 갖게 될 것입니다.

저는 사전이 최선의 접근 방식이라고 생각합니다. 하지만 Django 문서에는 Django 모델에 사전을 저장하는 방법에 대한 내용이 없습니다(또는 찾을 수 없습니다).

어떤 단서가 있나요?

도움이 되었습니까?

해결책

실제로 임의의 데이터와 같은 사전 인 경우 컨테이너 인 하나의 모델과 키 값 쌍의 다른 모델이있는 2 레벨 설정을 사용할 수 있습니다. 컨테이너 인스턴스를 생성하고 각 키 값 인스턴스를 작성하고 키 값 인스턴스 세트를 컨테이너 인스턴스와 연결합니다. 같은 것 :

class Dicty(models.Model):
    name      = models.CharField(max_length=50)

class KeyVal(models.Model):
    container = models.ForeignKey(Dicty, db_index=True)
    key       = models.CharField(max_length=240, db_index=True)
    value     = models.CharField(max_length=240, db_index=True)

예쁘지는 않지만 DB를 사용하여 사전의 내부에 액세스/검색 할 수 있지만 피클/직렬화 솔루션은 그렇지 않습니다.

다른 팁

이 추가 데이터를 쿼리 할 필요가 없다면 직렬화 된 사전으로 저장할 수 있습니다. 사용 repr 사전을 문자열로 바꾸려면 eval 문자열을 사전으로 되돌려 놓습니다. 사전에 사용자 데이터가 없거나 Safe_eval 구현을 사용하지 않음을 평가하십시오.

"Django Store Object"에 대한 Google의 4 번째 결과 로이 게시물에 왔습니다.

조금 늦었지만 Django-Picklefield 나에게 좋은 해결책처럼 보입니다.

Doc의 예 :

사용하려면 모델의 필드를 정의하십시오.

>>> from picklefield.fields import PickledObjectField
>>> class SomeObject(models.Model):
>>>     args = PickledObjectField()

그리고 당신이 좋아하는 모든 것을 (선택 가능한 한) 필드에 할당하십시오.

>>> obj = SomeObject()
>>> obj.args = ['fancy', {'objects': 'inside'}]
>>> obj.save()

또 다른 깨끗하고 빠른 솔루션은 여기에서 찾을 수 있습니다. https://github.com/bradjasper/django-jsonfield

편의를 위해 간단한 지침을 복사했습니다.

설치

pip install jsonfield

용법

from django.db import models
from jsonfield import JSONField

class MyModel(models.Model):
    json = JSONField()

Ned가 대답했듯이 사전 접근 방식을 사용하면 "일부 데이터"를 쿼리할 수 없습니다.

여전히 사전을 저장해야 하는 경우 가장 좋은 접근 방식은 Marty Alchin의 새 책에 문서화된 PickleField 클래스입니다. 프로 장고.이 메서드는 Python 클래스 속성을 사용하여 모델 필드에 저장된 Python 개체를 요청 시에만 피클/피클 해제합니다.

이 접근 방식의 기본은 django의 contibute_to_class 모델에 새 필드를 동적으로 추가하고 getattr/setattr을 사용하여 요청 시 직렬화를 수행하는 메서드입니다.

내가 찾을 수 있는 유사한 몇 가지 온라인 예 중 하나는 다음과 같습니다. JSON필드.

나는 당신이 해결하려는 문제의 본질을 정확히 확실하지 않지만 호기심이 비슷하게 들립니다. Google App Engine의 Bigtable Expando.

Expandos를 사용하면 런타임에 데이터베이스 지원 객체 인스턴스에 추가 필드를 지정하고 저장할 수 있습니다. 문서의 인용 :

import datetime
from google.appengine.ext import db

class Song(db.Expando):
  title = db.StringProperty()

crazy = Song(title='Crazy like a diamond',
             author='Lucy Sky',
             publish_date='yesterday',
             rating=5.0)

crazy.last_minute_note=db.Text('Get a train to the station.')

Google App Engine은 현재 Python과 Django 프레임 워크를 모두 지원합니다. 이것이 모델을 표현하는 가장 좋은 방법인지 조사 할 가치가 있습니다.

기존의 관계형 데이터베이스 모델에는 이러한 종류의 열 중단 유연성이 없습니다. 데이터 유형이 충분히 간단한 경우 전통적인 RDBMS 철학을 중단하고 Serialization을 통해 단일 열로 값을 해킹 할 수 있습니다. @Ned Batchelder 제안; 그러나 당신이 있다면 가지다 RDBMS를 사용하려면 Django 모델 상속이 아마도 갈 길입니다. 특히, 그것은 창조 될 것입니다 일대일 외국 키 각각의 도출 수준에 대한 관계.

다른 구조화 된 데이터를 단일 열로 스터핑해야한다는 데 동의합니다. 그러나 그렇게해야한다면 Django는 다음과 같습니다. xmlfield 만들어져있는.

또한 있습니다 Jsonfield Django Snipplets에서.

"모델의 모든 인스턴스와 동일하지 않다는 것은"스키마 프리 데이터베이스 "와 잘 어울리는 것처럼 들립니다. couchdb 그 접근법의 포스터 아이이며 당신은 그것을 고려할 수 있습니다.

프로젝트에서 나는 django orm과 함께하지 않은 몇 개의 테이블을 CouchDB로 옮겼습니다. 그리고 나는 그것에 매우 만족합니다. 나는 사용한다 Couchdb-Python Django- 특이 적 CouchDB 모듈이 없으면. 데이터 모델에 대한 설명을 찾을 수 있습니다 여기. Django의 5 개의 "모델"에서 Django의 3 개의 "모델"및 하나의 CouchDB "데이터베이스"로 이동하면 실제로 내 애플리케이션의 총 코드 라인이 약간 줄었습니다.

이 질문은 오래되었지만 같은 문제가 있었고 여기서 끝났고 선택한 대답은 더 이상 내 문제를 해결할 수 없었습니다.

Django 또는 REST API에 사전을 저장하려면 프론트 엔드의 객체로 사용되거나 데이터가 반드시 동일한 구조를 갖지 않기 때문에 내가 사용한 솔루션이 도움이 될 수 있습니다.

API에 데이터를 저장할 때 사용하십시오 json.dump () 이것에 설명 된대로 적절한 JSON 형식으로 저장할 수있는 방법 의문.

이 구조를 사용하는 경우 데이터는 이미 프론트 엔드에서 호출 할 적절한 JSON 형식으로 이미 사용됩니다. json.parse () Ajax (또는 무엇이든) 전화에서.

그것을 생각하고 각 데이터 세트의 공통점을 찾으십시오. 그런 다음 모델을 정의하십시오. 서브 클래스를 사용해야 할 수도 있습니다. 공통점을 나타내는 외국 열쇠는 피해서는 안되지만, 의미가있을 때 격려합니다.

무작위 데이터를 SQL 테이블에 채우는 것은 실제로 비 관계형 데이터가 아니라면 똑똑하지 않습니다. 이 경우 문제를 정의하면 도움을 줄 수 있습니다.

Django-Geo에는 도움이 될 수있는 "Dictionaryfield"가 포함되어 있습니다.

http://code.google.com/p/django-geo/source/browse/trunk/fields.py?r=13#49

일반적으로 데이터를 쿼리 할 필요가없는 경우 추가 쿼리를 피하기 위해 탈피 된 접근 방식을 사용하십시오. 사용자 설정은 꽤 좋은 예입니다!

Postgres를 사용하는 경우 hstore 필드를 사용할 수 있습니다. https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/fields/#hstorefield.

나는 텍스트 필드를 사용합니다 json.loads()/json.dumps()

models.py

import json
from django.db import models

class Item(models.Model):
    data = models.TextField(blank=True, null=True, default='{}')

    def save(self, *args, **kwargs):
        ## load the current string and
        ## convert string to python dictionary
        data_dict = json.loads(self.data)

        ## do something with the dictionary
        for something in somethings:
            data_dict[something] = some_function(something)

        ## if it is empty, save it back to a '{}' string,
        ## if it is not empty, convert the dictionary back to a json string
        if not data_dict:
            self.data = '{}'
        else:
            self.data = json.dumps(data_dict)


        super(Item, self).save(*args, **kwargs)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top