django - Django 在 APIView 中获取 ForeignKey 对象
问题描述
嘿,所以我是 Django 新手,我正在使用以下模型编写 REST API。
# models.py
class Order(models.Model):
order_name = models.CharField(max_length=10, unique=True, default="")
def __str__(self):
return '{0}'.format(self.order_name).
class LineItem(models.Model):
order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True)
product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
class Meta:
unique_together = ('order', 'product')
def __str__(self):
return '{} - {}'.format(self.order.order_name, self.product.product_name).
# views.py
class OrderList(APIView):
def get(self, request):
orderlist = Order.objects.all()
serializer = OrderSerializer(orderlist, many=True)
return Response(serializer.data)
def post(self, request):
serializer = OrderSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class OrderDetail(APIView):
def get_object(self, order):
try:
return Order.objects.get(order_name=order_name)
except Order.DoesNotExist:
raise Http404
def get(self, request, order_name):
snippet = Order.objects.get(order_name=order_name)
snippet = snippet.lineitem_set.all()
serializer = OrderSerializer(snippet)
return Response(serializer.data)
所以我正在尝试对 OrderDetail(APIView) 的 get 方法进行编码,以便在 /api/order/OrderA/ 处获得包含该顺序的所有 lineitem 的 JSON。我已经为此苦苦挣扎了一段时间。有什么建议么?
class OrderSerializer(serializers.ModelSerializer):
class Meta:
model = Order
fields = ['order_name']
解决方案
DRF 为您提供了一个类来获取对象的详细信息。看看这里: http: //www.django-rest-framework.org/api-guide/generic-views/#retrieveapiview
这是一个示例代码,如果order_name
使用 GET 方法在 url 中作为参数传递,则该示例代码应该可以工作。
from django.views.decorators.cache import never_cache
from django.utils.decorators import method_decorator
from rest_framework.exceptions import NotFound
from rest_framework.generics import RetrieveAPIView
# the decorator avoid to cache the object, maybe you don't need that.
@method_decorator(never_cache, name="dispatch")
class OrderDetail(RetrieveAPIView):
serializer_class = OrderSerializer
def get_object(self):
try:
return Order.objects.get(order_name=self.kwargs.get('order_name'))
except Order.DoesNotExist:
raise NotFound()
推荐阅读
- git - 与开发分支相比,查看当前分支上的文件如何更改
- c# - 如何拆分压缩包
- mysql - MySQL获取计数为百分比
- javascript - innerHTML 修改整个数组
- swift - 具有多个单元格的 TableView
- r - 从 txt 中读取字符并使用分页符编织
- c++ - 是否可以隐藏像 BOOST_LOG_TRIVIAL(lvl) 这样的宏
- c# - 在 ClientMessageInspector 和 ServerMessageInspecter 中识别是休息调用还是 WCF 调用
- c# - 使用 DNN 进行 Windows 身份验证
- android - 使用数据绑定时如何修复 InflateException 错误膨胀类片段