首页 > 解决方案 > 如何在不同的表中搜索 slug 并将项目添加到 orderItem 表中的一对多字段 Django?

问题描述

我想使用ForeignKey在OrderItem项目字段中添加不同的产品表,这次slug只在一个表 gamespc 中搜索并在OrderItem项目字段中只添加游戏 PC,它应该搜索我所有的产品表,并将产品添加到OrderItem使用ForeignKey的模型。

模型.py

class OrderItem(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    ordered = models.BooleanField(default=False)
    item = models.ForeignKey(
        gamingpc, on_delete=models.CASCADE, blank=True, null=True)
    product = models.ForeignKey(
        PcComponent, on_delete=models.CASCADE, blank=True, null=True)

视图.py

def post(self, request, *args, **kwargs):
    slug = request.data.get('slug')
    variations = request.data.get('variations', [])
    if slug is None:
        return Response({"message": "Invalid request"}, status=HTTP_400_BAD_REQUEST)

    item = get_object_or_404(gamingpc, slug=slug)

标签: pythondjangodjango-modelsdjango-rest-framework

解决方案


将您的模型更改为:

class OrderItem(models.Model):
            user = models.ForeignKey(settings.AUTH_USER_MODEL,
                                     on_delete=models.CASCADE)
            content_object = GenericForeignKey()
            object_id = models.CharField(max_length=100, null=True, blank=True)
            content_type = models.ForeignKey(
                ContentType, on_delete=models.CASCADE, null=True, blank=True,
                limit_choices_to=(models.Q(model__in=['PcComponent', 'gamingpc']))

并查看:

def post(self, request, *args, **kwargs):
    slug = request.data.get('slug')
    variations = request.data.get('variations', [])
    if slug is None:
        return Response({"message": "Invalid request"}, status=HTTP_400_BAD_REQUEST)

    item = get_object_or_404(gamingpc, slug=slug)
    order_item = OrderItem.objects.create(user=request.user, object_id=item.pk, content_type=ContentType.objects.get(model='gamingpc'))
    ...
    ...
    

推荐阅读