사용자가 여러 관련 요소를 만든 다음 해당 요소를 데이터베이스에 저장할 수있는 웹 앱을 개발 중입니다. webapp는 데이터베이스에 기본 키가 무엇인지 알지 못하므로 각 요소에 UUID를 할당합니다. 이러한 UUID는 데이터베이스의 각 요소와 함께 저장됩니다. webapp이 데이터를 웹 서버에 보내 데이터베이스에 저장하면 JSON을 사용하여 모든 것을 인코딩합니다. JSON은 serializers.deserialize('json', DATA)
을 사용하여 웹 서버에 의해 deserialize됩니다. 그러나 일부 모델에는 외래 키가 있으며이 외래 키는 데이터베이스 ID가 아닌 연관된 요소의 UUID에 대한 참조로 JSON 페이로드로 전송됩니다. 소스 2의 id 값이 있고 대상 (12)의 id 값이, 문제는이 같은 JSON으로 직렬화 될 수 있던 경우에Django의 모델에 임시 필드를 추가하려면 어떻게합니까?
class Link(models.Model):
uuid = models.CharField(max_length=32)
source = models.ForeignKey(Node, related_name='source')
target = models.ForeignKey(Node, related_name='target')
:
{"uuid": "[some long uuid]",
"source": 2,
"target": 12}
예를 들어, 우리는 간단한 링크 개체를 가질 수있다 이 경우 우리는 그들이 아직 설정되어 있지 않은 아마 때문에, 소스 및 대상의 데이터베이스 ID를 알 수 없기 때문에
하지만, 내가 할 수있는 최선이 같은 UUID의에서 통과되어
{"uuid": "[some long uuid]",
"sourceuuid": "[uuid of source]",
"targetuuid": "[uuid of target]"}
불행하게도 th 내가 serializers.deserialize
데이터를 호출했을 때 FieldDoesNotExist: Link has no field named u'sourceuuid'
예외가 발생합니다.
나는 UUID를 전달할 수있는 방법을 찾고 싶습니다. 그런 다음 적절한 부분을 저장하거나 필요할 때마다 ID를 채우면됩니다. 나는 정수를 저장하기위한 공간이 훨씬 적기 때문에 sourceuuid
과 targetuuid
을 데이터베이스에 저장하고 싶지 않고 표시도 빨라야합니다.
그래서 내가 찾고있는 것은 임시 필드입니다. 하나는 인스턴스화 및 참조 할 수 있지만 다시 데이터베이스에 저장되지 않습니다. 어떻게 그런 일을 만들어 낼 수 있을지에 대한 아이디어가 있습니까? 지금까지
감사합니다 도움에 대한 더 명확한 설명과
UPDATE, 나는 그들이 파이썬 객체를이고 나는 객체에 대한 임의의 필드를 할당 할 수 있음을 알고 있어요. 그러나 문제는 serializers.deserialize('json', INDATA)
이 오류를 발생시키는 것입니다. 그러나
ser='''[{"pk": 1, "model": "myapp.link",
"fields": {"uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"source": 2,
"target": 12}}]'''
serializer.deserialize('json',ser)
, 내가 무엇을 제공 할 수있는 것은 이것이다 :
ser='''[{"pk": 1, "model": "myapp.link",
"fields": {"uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"sourceuuid": "11111111-2222-3333-4444-555555555555",
"targetuuid": "66666666-7777-8888-9999-000000000000"}}]'''
serializer.deserialize('json',ser)
FieldDoesNotExist: Link has no field named u'sourceuuid'
이유 참고로
여기에 자신의 ID가 외부 키를 가지고, 디시리얼라이저가 좋아하는 JSON의 덩어리입니다 deserialize
에 실제 필드가 필요하기 때문에 실제 필드가되도록 더미 필드가 필요합니다.
이것은 가장 가까이에 있지만 예상대로는 아닙니다. 구체화되지 않은 Django 모델에 대한 ForeignKey는 여전히 참조하는 테이블에 컬럼을 추가합니다. 그러나'sourceuuid'와'targetuuid'를 새 필드로 사용하여 구체화되지 않은 전체 서브 클래스를 만들면 어딘가에 도착할 수 있습니다. 새로운'LinkJSON' 클래스에서 비 직렬화 한 다음 UUID를 매핑 한 다음 필드를'Link' 클래스에 복사합니다. 그것은 꽤 아니지만 그것은 다소 효과가 있습니다. 파이썬이 기본 클래스에 캐스트를 입력하는 쉬운 방법이 있다면 훨씬 더 좋을 것입니다. – Pridkett
나는이 대답을 내가 받아들이고 싶었던 것에 가장 가까웠 기 때문에 받아 들인다. 나는 펑키 서브 클래 싱을 수행하고 JSONSerializer의 서브 클래스를 만들어 모든 것을 처리해야했지만 지금은 작동합니다. 불행히도, 꽤 구체적인 솔루션이 되었기 때문에 StackOverflow에 그 전체를 게시 할 수는 없습니다. – Pridkett