我一直试图为一个模型创建一个序列化程序,其中一个字段是ManytoManyField,通过一个添加了更多字段的模型。问题是中间序列化程序没有识别已经添加了字段。为什么我做错了?
这是我的代码:
models.py:
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:
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:
class InputViewSet(viewsets.ModelViewSet):
queryset = Input.objects.order_by('-date')
serializer_class = InputSerializer
urls.py:
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
实例上的任何属性或键。 原始的例外文本是:“产品”对象没有属性“产品”。
发布于 2017-03-15 17:55:56
试试这个:
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
https://stackoverflow.com/questions/42813479
复制相似问题