Saleor新增产品QA功能触发Product对象无node属性AttributeError
报错根因
- 你的
QAType没有显式声明product、qa_by外键关联字段的具体GraphQL类型,graphene-django默认会为实现了graphene.relay.Node接口的关联模型生成Node类型字段,解析时尝试调用实例的node属性导致报错,而Saleor自带的Product、User模型对应的ObjectType都实现了Node接口。 - 次要问题:QA模型中product外键的
related_name设置为product语义冲突,虽然不是直接报错原因,但会导致后续反向查询逻辑混乱。
解决方案
- 导入Saleor内置的对应类型(以Saleor 3.x版本为例,导入路径根据自身版本调整即可)
from saleor.graphql.product.types import ProductType from saleor.graphql.account.types import UserType
- 在
QAType中显式声明外键字段的类型,覆盖默认生成的Node类型字段:
class QAType(CountableDjangoObjectType): product = graphene.Field(ProductType, description="关联的产品信息") qa_by = graphene.Field(UserType, description="执行QA的员工信息") class Meta: interfaces = [graphene.relay.Node] model = QA fields="__all__"
- 可选优化:修正模型外键的
related_name配置,避免后续反向查询语义冲突:
class QA (models.Model): # 修改related_name为合理值 product = models.ForeignKey(Product, related_name="qa_records", on_delete=models.CASCADE) qa_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True , blank=True) qa_status = models.CharField(max_length=10, choices=STATUS_CHOICE, default="Pending") qa_date = models.DateTimeField(null=True , blank=True)
- 可选优化:将
ProductQAInput中的qa_date类型从graphene.String改为graphene.DateTime,和模型字段类型保持一致,避免后续存入数据时报格式错误。
修改完成后重启服务,原有mutation语句即可正常返回产品、员工关联字段。
内容的提问来源于stack exchange,提问作者vikrant
相关产品推荐
相关产品推荐

