Как получить идентификатор экземпляра после save_m2m в admin django - PullRequest
0 голосов
/ 17 января 2020

У меня есть метод в admin.py

def save_model(self, request, instance, form, change):

    user = request.user
    instance = form.save(commit=False)

    if not change or not instance.created_by:
        instance.created_by = user
    instance.save()
    form.save_m2m()
    if instance.send_to_killer:
        serializer = OrderSerializer(
                instance)
        emailClass = Email() 
        emailClass.sendemail(serializer, 1, instance)
    return instance

, а другой -

class Email(object):
    def sendemail(self, data, sendfrom, instance):
        print(instance.id)
        orders_item = order_item.objects.filter(order_id=instance.id)
        print(orders_item)
        for item in orders_item:
            print(item.qty)

Я получил instance.id, но не получаю orders_item, поскольку элементы сохраняются после заказа. Так как же я могу получить данные элементов заказа при сохранении м2м ??

моделей:

class Order(models.Model):
    date = models.DateField(default=timezone.now)
    project = models.ForeignKey(
        Project, on_delete=models.CASCADE, limit_choices_to={'is_active': True})
    send_to_killer = models.BooleanField(default=False)
    send_to_sigler = models.BooleanField(default=False)
    created_at = models.DateTimeField(default=timezone.now)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)


class order_item(models.Model):
    # When a Event is deleted, upload models are also deleted
    order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name="order_item",
                              related_query_name="order_item")
    item = models.ForeignKey(
        Item, on_delete=models.CASCADE, limit_choices_to={'is_active': True}, blank=True, default="")
    qty = models.IntegerField(default=0, blank=True)
    price = models.DecimalField(
        default=Decimal(0), max_digits=12, decimal_places=2, blank=True)

и сериализаторов порядка и порядка_узлов

class orderItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = order_item
        fields = ['qty', 'price']


class OrderSerializer(serializers.ModelSerializer):
    order_items = orderItemSerializer(many=True, read_only=True)

    class Meta:
        model = Order
        fields = ['id', 'date', 'project', 'order_items']

1 Ответ

0 голосов
/ 17 января 2020

Вы можете сделать это с помощью сигнала.

from django.db.models.signals import m2m_changed

m2m_changed.connect(sendemail, sender=YourTable.YourTable_many_to_many_attribute.through)

Для получения подробной информации, пожалуйста, поделитесь своей моделью

...