์นดํ…Œ๊ณ ๋ฆฌ ๋ณด๊ด€๋ฌผ: Python

Python

Django Model ๊ฐ์ฒด๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค. auto_now_add

Django Model ๊ฐ์ฒด๋ฅผ ๋ชจ๋“  ํ•„๋“œ ๊ฐ€์žˆ๋Š” dict๋กœ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜ ํ•ฉ๋‹ˆ๊นŒ? ๋ชจ๋‘ ์ด์ƒ์ ์œผ๋กœ๋กœ ์™ธ๋ž˜ ํ‚ค์™€ ํ•„๋“œ๋ฅผ ํฌํ•จ editable=Falseํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ๊ณ  ๋ชจ๋ธ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ด…์‹œ๋‹ค.

from django.db import models

class OtherModel(models.Model): pass

class SomeModel(models.Model):
    normal_value = models.IntegerField()
    readonly_value = models.IntegerField(editable=False)
    auto_now_add = models.DateTimeField(auto_now_add=True)
    foreign_key = models.ForeignKey(OtherModel, related_name="ref1")
    many_to_many = models.ManyToManyField(OtherModel, related_name="ref2")

ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

other_model = OtherModel()
other_model.save()
instance = SomeModel()
instance.normal_value = 1
instance.readonly_value = 2
instance.foreign_key = other_model
instance.save()
instance.many_to_many.add(other_model)
instance.save()

์ด๊ฒƒ์„ ๋‹ค์Œ ์‚ฌ์ „์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

{'auto_now_add': datetime.datetime(2015, 3, 16, 21, 34, 14, 926738, tzinfo=<UTC>),
 'foreign_key': 1,
 'id': 1,
 'many_to_many': [1],
 'normal_value': 1,
 'readonly_value': 2}

๋ถˆ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๋‹ต๋ณ€์ด์žˆ๋Š” ์งˆ๋ฌธ :

Django : ๋ชจ๋ธ ๊ฐ์ฒด ์ „์ฒด๋ฅผ ๋‹จ์ผ ์‚ฌ์ „์œผ๋กœ ๋ณ€ํ™˜

Django Model ๊ฐ์ฒด๋ฅผ ์‚ฌ์ „์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์™ธ๋ž˜ ํ‚ค๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?



๋‹ต๋ณ€

๋‹ค์–‘ํ•œ ์ˆ˜์ค€์˜ ์ฝ”๋„ˆ ์ผ€์ด์Šค ์ฒ˜๋ฆฌ ๋ฐ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ์™€์˜ ๊ทผ์ ‘์„ฑ์„ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์ „์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


1. instance.__dict__

instance.__dict__

์–ด๋–ค ๋ฐ˜ํ™˜

{'_foreign_key_cache': <OtherModel: OtherModel object>,
 '_state': <django.db.models.base.ModelState at 0x7ff0993f6908>,
 'auto_now_add': datetime.datetime(2018, 12, 20, 21, 34, 29, 494827, tzinfo=<UTC>),
 'foreign_key_id': 2,
 'id': 1,
 'normal_value': 1,
 'readonly_value': 2}

์ด๊ฒƒ์€ ์ง€๊ธˆ๊นŒ์ง€ ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜์ง€๋งŒ ๋ˆ„๋ฝ many_to_many๋˜์–ด foreign_key์žˆ๊ณ  ์ด๋ฆ„์ด ์ž˜๋ชป๋˜์–ด ์žˆ์œผ๋ฉฐ ์›์น˜ ์•Š๋Š” ๋‘ ๊ฐ€์ง€ ์ถ”๊ฐ€ ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


2. model_to_dict

from django.forms.models import model_to_dict
model_to_dict(instance)

์–ด๋–ค ๋ฐ˜ํ™˜

{'foreign_key': 2,
 'id': 1,
 'many_to_many': [<OtherModel: OtherModel object>],
 'normal_value': 1}

์ด (๊ฐ€)์žˆ๋Š” ์œ ์ผํ•œ ํ•ญ๋ชฉ many_to_many์ด์ง€๋งŒ ํŽธ์ง‘ ํ•  ์ˆ˜์—†๋Š” ํ•„๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.


์‚ผ. model_to_dict(..., fields=...)

from django.forms.models import model_to_dict
model_to_dict(instance, fields=[field.name for field in instance._meta.fields])

์–ด๋–ค ๋ฐ˜ํ™˜

{'foreign_key': 2, 'id': 1, 'normal_value': 1}

์ด๊ฒƒ์€ ํ‘œ์ค€ model_to_dictํ˜ธ์ถœ ๋ณด๋‹ค ์—„๊ฒฉํžˆ ๋‚˜์ฉ๋‹ˆ๋‹ค .


4. query_set.values()

SomeModel.objects.filter(id=instance.id).values()[0]

์–ด๋–ค ๋ฐ˜ํ™˜

{'auto_now_add': datetime.datetime(2018, 12, 20, 21, 34, 29, 494827, tzinfo=<UTC>),
 'foreign_key_id': 2,
 'id': 1,
 'normal_value': 1,
 'readonly_value': 2}

์ด๋Š” instance.__dict__์ถ”๊ฐ€ ํ•„๋“œ๊ฐ€์—†๋Š” ์ถœ๋ ฅ๊ณผ ๋™์ผ ํ•ฉ๋‹ˆ๋‹ค.
foreign_key_id์—ฌ์ „ํžˆ ์ž˜๋ชป๋˜์–ด many_to_many์—ฌ์ „ํžˆ ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


5. ์‚ฌ์šฉ์ž ์ •์˜ ๊ธฐ๋Šฅ

django์˜ ์ฝ”๋“œ model_to_dict๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋Œ€๋‹ต์„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŽธ์ง‘ ํ•  ์ˆ˜์—†๋Š” ํ•„๋“œ๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ์ œ๊ฑฐ ํ–ˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋งŽ์€ ํ•„๋“œ์—์„œ ์™ธ๋ž˜ ํ‚ค์˜ ID๋ฅผ ์–ป์œผ๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์›ํ•˜๋Š”๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

from itertools import chain

def to_dict(instance):
    opts = instance._meta
    data = {}
    for f in chain(opts.concrete_fields, opts.private_fields):
        data[f.name] = f.value_from_object(instance)
    for f in opts.many_to_many:
        data[f.name] = [i.id for i in f.value_from_object(instance)]
    return data

์ด๊ฒƒ์ด ๊ฐ€์žฅ ๋ณต์žกํ•œ ์˜ต์…˜์ด์ง€๋งŒ ํ˜ธ์ถœ to_dict(instance)ํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{'auto_now_add': datetime.datetime(2018, 12, 20, 21, 34, 29, 494827, tzinfo=<UTC>),
 'foreign_key': 2,
 'id': 1,
 'many_to_many': [2],
 'normal_value': 1,
 'readonly_value': 2}

6. ์‹œ๋ฆฌ์–ผ ๋ผ์ด์ € ์‚ฌ์šฉ

Django Rest Framework ์˜ ModelSerialzer๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋ธ์—์„œ ์ž๋™์œผ๋กœ ์‹œ๋ฆฌ์–ผ ๋ผ์ด์ €๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from rest_framework import serializers
class SomeModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = SomeModel
        fields = "__all__"

SomeModelSerializer(instance).data

๋ณด๊ณ 

{'auto_now_add': '2018-12-20T21:34:29.494827Z',
 'foreign_key': 2,
 'id': 1,
 'many_to_many': [2],
 'normal_value': 1,
 'readonly_value': 2}

์ด๊ฒƒ์€ ๊ฑฐ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜๋งŒํผ ์ข‹์ง€๋งŒ auto_now_add๋Š” datetime ๊ฐ์ฒด ๋Œ€์‹  ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.


๋ณด๋„ˆ์Šค ๋ผ์šด๋“œ : ๋” ๋‚˜์€ ๋ชจ๋ธ ์ธ์‡„

๋” ๋‚˜์€ ํŒŒ์ด์ฌ ์ปค๋งจ๋“œ ๋ผ์ธ ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ๊ฐ€์ง„ ์žฅ๊ณ  ๋ชจ๋ธ์„ ์›ํ•œ๋‹ค๋ฉด, ๋ชจ๋ธ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž์‹ ํด๋ž˜์Šค๋ฅผ ๊ฐ–๋„๋กํ•˜์‹ญ์‹œ์˜ค :

from django.db import models
from itertools import chain

class PrintableModel(models.Model):
    def __repr__(self):
        return str(self.to_dict())

    def to_dict(instance):
        opts = instance._meta
        data = {}
        for f in chain(opts.concrete_fields, opts.private_fields):
            data[f.name] = f.value_from_object(instance)
        for f in opts.many_to_many:
            data[f.name] = [i.id for i in f.value_from_object(instance)]
        return data

    class Meta:
        abstract = True

์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋ธ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•˜๋ฉด

class OtherModel(PrintableModel): pass

class SomeModel(PrintableModel):
    normal_value = models.IntegerField()
    readonly_value = models.IntegerField(editable=False)
    auto_now_add = models.DateTimeField(auto_now_add=True)
    foreign_key = models.ForeignKey(OtherModel, related_name="ref1")
    many_to_many = models.ManyToManyField(OtherModel, related_name="ref2")

ํ˜ธ์ถœ SomeModel.objects.first()ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

{'auto_now_add': datetime.datetime(2018, 12, 20, 21, 34, 29, 494827, tzinfo=<UTC>),
 'foreign_key': 2,
 'id': 1,
 'many_to_many': [2],
 'normal_value': 1,
 'readonly_value': 2}

๋‹ต๋ณ€

๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜์žˆ๋Š” ๊น”๋”ํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

๋ชจ๋ธ ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์‹ญ์‹œ์˜ค o.

๊ทธ๋ƒฅ ์ „ํ™”ํ•˜์‹ญ์‹œ์˜ค :

type(o).objects.filter(pk=o.pk).values().first()

๋‹ต๋ณ€

@ Zags ์†”๋ฃจ์…˜์€ ํ™”๋ คํ–ˆ์Šต๋‹ˆ๋‹ค!

๊ทธ๋Ÿฌ๋‚˜ JSON์„ ์นœํ™”์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‚ ์งœ ํ•„๋“œ์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

๋ณด๋„ˆ์Šค ๋ผ์šด๋“œ

๋” ๋‚˜์€ ํŒŒ์ด์ฌ ๋ช…๋ น ์ค„ ํ‘œ์‹œ๋ฅผ ๊ฐ€์ง„ ์žฅ๊ณ  ๋ชจ๋ธ์„ ์›ํ•œ๋‹ค๋ฉด ๋ชจ๋ธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž์‹ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.

from django.db import models
from django.db.models.fields.related import ManyToManyField

class PrintableModel(models.Model):
    def __repr__(self):
        return str(self.to_dict())

    def to_dict(self):
        opts = self._meta
        data = {}
        for f in opts.concrete_fields + opts.many_to_many:
            if isinstance(f, ManyToManyField):
                if self.pk is None:
                    data[f.name] = []
                else:
                    data[f.name] = list(f.value_from_object(self).values_list('pk', flat=True))
            elif isinstance(f, DateTimeField):
                if f.value_from_object(self) is not None:
                    data[f.name] = f.value_from_object(self).timestamp()
            else:
                data[f.name] = None
            else:
                data[f.name] = f.value_from_object(self)
        return data

    class Meta:
        abstract = True

์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋ธ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•˜๋ฉด

class OtherModel(PrintableModel): pass

class SomeModel(PrintableModel):
    value = models.IntegerField()
    value2 = models.IntegerField(editable=False)
    created = models.DateTimeField(auto_now_add=True)
    reference1 = models.ForeignKey(OtherModel, related_name="ref1")
    reference2 = models.ManyToManyField(OtherModel, related_name="ref2")

ํ˜ธ์ถœ SomeModel.objects.first()ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

{'created': 1426552454.926738,
'value': 1, 'value2': 2, 'reference1': 1, u'id': 1, 'reference2': [1]}

๋‹ต๋ณ€

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•,

  1. ์ฟผ๋ฆฌ๊ฐ€ Model.Objects.get () ์ธ ๊ฒฝ์šฐ :

    get ()์€ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค __dict__ ์ธ์Šคํ„ด์Šค์—์„œ

    model_dict = Model.Objects.get().__dict__

  2. ์— ๋Œ€ํ•œ ํ•„ํ„ฐ () / ๋ชจ๋“  () :

    all () / filter () ๋Š” ์ธ์Šคํ„ด์Šค ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ values()๊ฐ์ฒด ๋ชฉ๋ก์„ ์–ป๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

    model_values โ€‹โ€‹= Model.Objects.all (). values โ€‹โ€‹()


๋‹ต๋ณ€

๊ทธ๋ƒฅ vars(obj)๊ฐ์ฒด์˜ ์ „์ฒด ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

>>> obj_attrs = vars(obj)
>>> obj_attrs
 {'_file_data_cache': <FileData: Data>,
  '_state': <django.db.models.base.ModelState at 0x7f5c6733bad0>,
  'aggregator_id': 24,
  'amount': 5.0,
  'biller_id': 23,
  'datetime': datetime.datetime(2018, 1, 31, 18, 43, 58, 933277, tzinfo=<UTC>),
  'file_data_id': 797719,
 }

์ด๊ฒƒ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค

>>> keys = obj_attrs.keys()
>>> temp = [obj_attrs.pop(key) if key.startswith('_') else None for key in keys]
>>> del temp
>>> obj_attrs
   {
    'aggregator_id': 24,
    'amount': 5.0,
    'biller_id': 23,
    'datetime': datetime.datetime(2018, 1, 31, 18, 43, 58, 933277, tzinfo=<UTC>),
    'file_data_id': 797719,
   }

๋‹ต๋ณ€

์ตœ์‹  ์ •๋ณด

@zags์— ์˜ํ•ด ๊ฒŒ์‹œ ๋œ ์ƒˆ๋กœ์šด ์ง‘๊ณ„ ๋‹ต๋ณ€์€ ๋‚ด ๊ฒƒ๋ณด๋‹ค ์™„๋ฒฝํ•˜๊ณ  ์šฐ์•„ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ํ•ด๋‹น ๋‹ต๋ณ€์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์‹ค๋ฌผ

@karthiker๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ž์‹ ์˜ to_dict ๋ฉ”์†Œ๋“œ๋ฅผ ๊ธฐ๊บผ์ด ์ •์˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์ด ๋ฌธ์ œ๋ฅผ ์„ธํŠธ ๋ฌธ์ œ๋กœ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค.

>>># Returns a set of all keys excluding editable = False keys
>>>dict = model_to_dict(instance)
>>>dict

{u'id': 1L, 'reference1': 1L, 'reference2': [1L], 'value': 1}


>>># Returns a set of editable = False keys, misnamed foreign keys, and normal keys
>>>otherDict = SomeModel.objects.filter(id=instance.id).values()[0]
>>>otherDict

{'created': datetime.datetime(2014, 2, 21, 4, 38, 51, tzinfo=<UTC>),
 u'id': 1L,
 'reference1_id': 1L,
 'value': 1L,
 'value2': 2L}

otherDict ์—์„œ ์ž˜๋ชป ๋ ˆ์ด๋ธ” ๋œ ์™ธ๋ž˜ ํ‚ค๋ฅผ ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค .

์ด๋ฅผ ์œ„ํ•ด ๋ฐ‘์ค„์ด์žˆ๋Š” ํ•ญ๋ชฉ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ํ•ญ๋ชฉ์ด ํฌํ•จ ๋œ ์ƒˆ ์‚ฌ์ „์„ ๋งŒ๋“œ๋Š” ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์ „์„ ํ›„๋“œ ์•„๋ž˜์— ์„ค์ • ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›๋ž˜ dict์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

>>>for item in otherDict.items():
...    if "_" not in item[0]:
...            dict.update({item[0]:item[1]})
...
>>>

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์ˆ ์„ ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค .

>>>dict
{'created': datetime.datetime(2014, 2, 21, 4, 38, 51, tzinfo=<UTC>),
 u'id': 1L,
 'reference1': 1L,
 'reference2': [1L],
 'value': 1,
 'value2': 2L}

๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ๋Œ๋ ค์ค๋‹ˆ๋‹ค.

๋‹จ์ ์€ editable = false ํ•„๋“œ ์ด๋ฆ„์— ๋ฐ‘์ค„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊พธ๋กœ, ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ํ•„๋“œ์— ๋ฐ‘์ค„์ด ํฌํ•จ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ํ•„๋“œ ์ง‘ํ•ฉ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ์ง€๋งŒ๋ณด๋‹ค ์ง์ ‘์ ์ธ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ์ž„์‹œ ์†”๋ฃจ์…˜์œผ๋กœ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ dict๋Š” model_to_dict๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ณ  otherDict๋Š” ํ•„ํ„ฐ์˜ ๊ฐ’ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ ์ž์ฒด ์—์„œ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ๊ธฐ๊ณ„๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋ธ์„ ์ˆ˜๋ฝํ•˜๋„๋ก ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

>>> import datetime
>>> dict = {u'id': 1, 'reference1': 1, 'reference2': [1], 'value': 1}
>>> otherDict = {'created': datetime.datetime(2014, 2, 21, 4, 38, 51), u'id': 1, 'reference1_id': 1, 'value': 1, 'value2': 2}
>>> for item in otherDict.items():
...     if "_" not in item[0]:
...             dict.update({item[0]:item[1]})
...
>>> dict
{'reference1': 1, 'created': datetime.datetime(2014, 2, 21, 4, 38, 51), 'value2': 2, 'value': 1, 'id': 1, 'reference2': [1]}
>>>

๊ทธ๊ฒƒ์€ ๋‹น์‹ ์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์˜ ๊ฑฐ์นœ ์•ผ๊ตฌ์žฅ์— ๋‹น์‹ ์„ ๋‘์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.


๋‹ต๋ณ€

ํฅ๋ฏธ๋กœ์šด ์†”๋ฃจ์…˜์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์†”๋ฃจ์…˜์€ dict comprehension์œผ๋กœ ๋ชจ๋ธ์— as_dict ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.

def as_dict(self):
    return dict((f.name, getattr(self, f.name)) for f in self._meta.fields)

๋˜ํ•œ์ด ์†”๋ฃจ์…˜์„ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋ชฉ๋ก ์ดํ•ด์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋ธ์„ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋‚ด๋ณด๋‚ด๋ ค๋Š” ๊ฒฝ์šฐ ํ›Œ๋ฅญํ•œ ์†”๋ฃจ์…˜์ด๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŒฌ๋” ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์— ๋ชจ๋ธ์„ ๋คํ”„ํ•˜๋Š” ๊ฒฝ์šฐ :

pandas_awesomeness = pd.DataFrame([m.as_dict() for m in SomeModel.objects.all()])

์ด ๊ธ€์€ Python ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋ถ„๋ฅ˜๋˜์—ˆ๊ณ  ๋‹˜์— ์˜ํ•ด ์— ์ž‘์„ฑ๋์Šต๋‹ˆ๋‹ค.