我有一個擁有公司的應用程序,該公司可以有0個或多個地址。公司不是唯一可以解決問題的「模式」。爲了實現這一點,我使用ContentTypes。Django Rest Framework:如何使用ContentType進行嵌套序列化
models.py
class Company(models.Model):
''' models a company in the system. '''
number = models.CharField(_('Number'), unique=True, max_length=20)
name = models.CharField(_('Name'), max_length=100)
active = models.BooleanField(_('Active'), default=True)
def _get_addresses(self):
'''
'''
contentType = ContentType.objects.get(
model=self.__class__.__name__.lower()
)
try:
addresses = Address.objects.get(
actor_type=contentType, actor_id=self.id
)
except Address.DoesNotExist:
addresses = []
return addresses
addresses = property(_get_addresses)
class Address(Auditable):
''' models an address '''
actor_type = models.ForeignKey(ContentType)
actor_id = models.PositiveIntegerField()
actor_object = fields.GenericForeignKey('actor_type', 'actor_id')
_type = models.CharField(
_('Address Type'),
max_length=10,
choices=sorted(TYPES.items())
)
active = models.BooleanField(default=True)
address1 = models.CharField(_('Address 1'), max_length=50)
address2 = models.CharField(
_('Address 2'),
max_length=50,
...
這樣,我也可以有一個Profile模型,我可以多個地址鏈接到一個配置文件。但是,當我試圖實現串行器時,我的問題就出現了。
Serializers.py
class AddressSerializer(serializers.ModelSerializer):
class Meta:
model = Address
fields = (
'_type',
'address1',
'address2',
'address3',
'country',
'state',
'city'
)
class CompanySerializer(serializers.ModelSerializer):
addresses = AddressSerializer(required=False, many=True)
class Meta:
model = Company
fields = (
'number',
'name',
'addresses'
)
這個實現使我這個error。它說它不能遍歷Address模型(這是有道理的),但我不知道如何讓我的地址迭代。
我不僅需要對公司進行CRUD操作,還需要對嵌套地址es執行CRUD操作。
關於如何去做這件事的任何建議/想法?
有公司和地址之間沒有直接關係,是嗎? – zaidfazil
@FazilZaid從'Company'到'Address'沒有關係(除了'addresses'屬性,只是將它添加到models.py中),但是你可以從'Address'到'Company'獲得關係,或者到任何其他型號。 – m4rk4l
但是,通用外鍵是不可訪問的,因爲你可以做序列化的字段...... – zaidfazil