上下文:使用Django Rest框架,我创建了一个ModelViewSet。在
对于这些型号:
class Claim(models.Model):
permalink = models.SlugField(max_length=255, blank=True, unique=True)
author = models.ForeignKey(get_user_model(), db_index=True, on_delete=models.SET_NULL, null=True, blank=True)
deleted = models.BooleanField(db_index=True, default=False)
collaborators = models.ManyToManyField(get_user_model(), through='ClaimCollaborator', through_fields=('claim', 'user'), related_name='claims')
# ...other fields
class ClaimCollaborator(models.Model):
claim = models.ForeignKey(Claim, db_index=True, on_delete=models.CASCADE)
user = models.ForeignKey(get_user_model(), db_index=True, on_delete=models.CASCADE)
access_project_only = models.BooleanField(default=True)
我试图查询Claim
以左连接ClaimCollaborator
,并返回{ClaimCollaborator
实际上是一个中介模型,处理声明和用户(声明的协作者)之间的大量关系。在
到目前为止,我有以下观点(为简洁起见,请删减):
^{pr2}$序列化程序:
class ClaimSerializer(serializers.HyperlinkedModelSerializer):
author = serializers.PrimaryKeyRelatedField(allow_null=True, queryset=get_user_model().objects.all())
class Meta:
model = Claim
fields = ('url', 'permalink', 'author', 'deleted')
lookup_field = 'permalink'
extra_kwargs = {
'url': {'lookup_field': 'permalink'},
}
列表生成以下SQL:
SELECT "api_claim"."permalink", "api_claim"."author_id", "api_claim"."deleted"
LEFT OUTER JOIN "api_claimcollaborator" ON ("api_claim"."id" = "api_claimcollaborator"."claim_id")
WHERE ("api_claim"."author_id" = 39 OR "api_claimcollaborator"."user_id" = 39)
所以我得到了“api_claimcollaborator”(claimcollaborator)的左连接,但是没有任何字段。我尝试过在查询中使用.only(<claim fields>, 'claimcollaborator__access_project_only')
和.selected_related('claimcollaborator')
,但这只会产生错误(如果有帮助,我可以更具体地说明我的尝试-请告诉我)。在
我想这并不是那么简单,因为在ORM中,所讨论的表被用作manytomy?任何帮助都将不胜感激。在
可以在序列化程序上使用
SlugRelatedField
来指示由特定属性标识的相关模型上的字段。在相关问题 更多 >
编程相关推荐