Как получить экземпляры класса с некоторыми определенными условиями?
У меня есть модель Order, из которой я хочу получить все данные в поле "ref_code", но затем я хочу отфильтровать их по элементу. То есть, по сути, я хочу получить все ref_code конкретного items (которое также является полем по manytomany). Я не знаю, как настроить его, чтобы он работал. Пока что я могу получить только все ref_code.
Любая помощь будет оценена по достоинству.
Модель:
class Order(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
ref_code = models.CharField(max_length=20, blank=True, null=True)
items = models.ManyToManyField(eOrderItem)
item = models.ForeignKey(
'blog.Post', on_delete=models.CASCADE, blank=True, null=True)
start_date = models.DateTimeField(auto_now_add=True)
ordered_date = models.DateTimeField()
ordered = models.BooleanField(default=False)
shipping_address = models.ForeignKey(
'Address', related_name='shipping_address', on_delete=models.SET_NULL, blank=True, null=True)
billing_address = models.ForeignKey(
'Address', related_name='billing_address', on_delete=models.SET_NULL, blank=True, null=True)
payment = models.ForeignKey(
'Payment', on_delete=models.SET_NULL, blank=True, null=True)
coupon = models.ForeignKey(
'Coupon', on_delete=models.SET_NULL, blank=True, null=True)
being_delivered = models.BooleanField(default=False)
received = models.BooleanField(default=False)
refund_requested = models.BooleanField(default=False)
refund_granted = models.BooleanField(default=False)
transaction_id = models.CharField(max_length=200, null=True, blank=True)
qr_code = models.ImageField(upload_to='qrcode', blank=True)
def __str__(self):
return self.user.username
def save(self, *args, **kwargs):
qrcode_img = qrcode.make(self.ref_code)
canvas = Image.new('RGB', (290, 290), 'white')
draw = ImageDraw.Draw(canvas)
canvas.paste(qrcode_img)
fname = f'qr_code-{self.ref_code}.png'
buffer = BytesIO()
canvas.save(buffer, 'PNG')
self.qr_code.save(fname, File(buffer), save=False)
canvas.close()
super().save(*args, **kwargs)
def get_total(self):
total = 0
for order_item in self.items.all():
total += order_item.get_final_price()
if self.coupon:
total -= self.coupon.amount
return total
Вид:
class RefCodesList(APIView):
serializers_class = OrderRefSerializer
def get(self, request, *args, **kwargs):
slug = request.data.get('slug', None)
item = get_object_or_404(Post, slug=slug)
p = Order.objects.all().values_list('ref_code', flat=True)
return Response(p, status=HTTP_200_OK)
Сериализаторы:
class OrderRefSerializer(serializers.ModelSerializer):
class Meta:
model = Order
fields = '__all__'
Спасибо.