首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用中间模型时序列化程序上的Django属性错误

使用中间模型时序列化程序上的Django属性错误
EN

Stack Overflow用户
提问于 2017-03-15 15:02:29
回答 1查看 440关注 0票数 0

我一直试图为一个模型创建一个序列化程序,其中一个字段是ManytoManyField,通过一个添加了更多字段的模型。问题是中间序列化程序没有识别已经添加了字段。为什么我做错了?

这是我的代码:

models.py:

代码语言:javascript
运行
复制
class Product(models.Model):
    name = models.CharField(max_length=30, unique=True)

class Movement(models.Model):
    date = models.DateTimeField(auto_now_add=True)
    products = models.ManyToManyField(Product, through='Movement_Product')

class Movement_Product(models.Model):
    movement = models.ForeignKey(Movement)
    product = models.ForeignKey(Product)
    amount = models.IntegerField()
    price = models.DecimalField(max_digits=9, decimal_places=2)

class Input(Movement):
    invoice_number = models.CharField(max_length=30, null=True)

serializers.py:

代码语言:javascript
运行
复制
class ProductSerializer(serializers.ModelSerializer):

    class Meta:
        model = Product

class MovementProductSerializer(serializers.ModelSerializer):
    product = ProductSerializer()
    price = serializers.DecimalField(max_digits=9, decimal_places=2)
    amount = serializers.IntegerField()

    class Meta:
        model = Movement_Product

class InputSerializer(serializers.ModelSerializer):
    date = serializers.DateTimeField()
    products = MovementProductSerializer(many=True)

    class Meta:
        model = Input

views.py:

代码语言:javascript
运行
复制
class InputViewSet(viewsets.ModelViewSet):
    queryset = Input.objects.order_by('-date')
    serializer_class = InputSerializer

urls.py:

代码语言:javascript
运行
复制
router = routers.DefaultRouter()
router.register(r'input', views.InputViewSet)

urlpatterns = [
    url(r'^api/', include(router.urls)),
    url(r'^admin/', admin.site.urls),
]

在浏览器InputSerializer中尝试在URL路径上呈现http://127.0.0.1:8000/api/input/时遇到的错误

属性错误在/api/input/ 在试图获取序列化程序AttributeError上的字段product值时获得MovementProductSerializer。 序列化程序字段的命名可能不正确,并且不匹配Product实例上的任何属性或键。 原始的例外文本是:“产品”对象没有属性“产品”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-15 17:55:56

试试这个:

代码语言:javascript
运行
复制
class Movement(models.Model):
    date = models.DateTimeField(auto_now_add=True)
    products = models.ManyToManyField(Product, through='Movement_Product')

    @property
    def movement_product(self):
        return Movement_Product.objects.filter(movement=self)

class InputSerializer(serializers.ModelSerializer):
    date = serializers.DateTimeField()
    products = serializers.ListField(child=MovementProductSerializer(), source='movement_product')

    class Meta:
        model = Input
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42813479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档