我有一个关于处理m2m /通过模型及其在django rest框架中的表示的问题.我们来看一个经典的例子:
models.py:
from django.db import models
class Member(models.Model):
name = models.CharField(max_length = 20)
groups = models.ManyToManyField('Group', through = 'Membership')
class Group(models.Model):
name = models.CharField(max_length = 20)
class Membership(models.Model):
member = models.ForeignKey('Member')
group = models.ForeignKey('Group')
join_date = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)
serializers.py:
imports...
class MemberSerializer(ModelSerializer):
class Meta:
model = Member
class GroupSerializer(ModelSerializer):
class Meta:
model = Group
Run Code Online (Sandbox Code Playgroud)
views.py:
imports...
class MemberViewSet(ModelViewSet):
queryset = Member.objects.all()
serializer_class = MemberSerializer
class GroupViewSet(ModelViewSet):
queryset = Group.objects.all()
serializer_class = GroupSerializer
Run Code Online (Sandbox Code Playgroud)
在获取成员实例时,我成功接收了所有成员的字段及其组 - 但是我只获得了组的详细信息,而没有来自成员模型的额外详细信息.
换句话说,我希望收到:
{ …Run Code Online (Sandbox Code Playgroud) 我无法弄清楚为什么我会收到此错误“序列化程序字段可能命名不正确,并且与GenericRelatedObjectManager实例上的任何属性或键都不匹配。原始异常文本是:'GenericRelatedObjectManager' 对象没有属性 'country'。”。我已经为此工作了几天,有人可以帮助我吗?我的代码有什么问题?提前致谢。
我想创建一个具有 CRUD 功能的嵌套序列化程序。计划在我的 DRF 中使用它。
我有 3 个相互关联的模型,即公司、地址和国家。
模型结构
Company
|__Address (GenericForeignKey)
|___Country (ForeignKey)
Run Code Online (Sandbox Code Playgroud)
公司模式
from django_countries.fields import CountryField
class SalesClientCompany(models.Model):
address = GenericRelation(
Address,
null=True,
blank=True,
)
Run Code Online (Sandbox Code Playgroud)
地址模型
class Address(models.Model):
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE,)
object_id = models.UUIDField(
primary_key=False,
unique=False,
default=uuid.uuid4,
blank=True,
null=True,
)
content_object = GenericForeignKey()
country = models.ForeignKey(
Country,
verbose_name=_("Country"),
to_field='country',
blank=False,
on_delete=models.CASCADE,
)
Run Code Online (Sandbox Code Playgroud)
国家模式
from django_countries.fields import CountryField
class Country(SmardtAbstractHistory): …Run Code Online (Sandbox Code Playgroud)