Search code examples
pythondjangodjango-2.1

how to get specific users from django user in another model


I have this model called UserTypes in this model i use User as OneToOne field and UserTypes model is inline with User model. I created this model to give the user a status just like we do is_staff=True. now i want to display all the users whose staff_status = "Delivery Boy" in another model called Order which is in another app in the same project

model.py(app1)

class UserTypes(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    staff_choices = (
        ('', ''),
        ('Admin', 'Admin'),
        ('Chef', 'Chef'),
        ('Delivery Boy', 'Delivery Boy'),
    )
    staff_status = models.CharField(max_length=15, choices=staff_choices, default=staff_choices[0][0]) 

    def __str__(self):
        return self.staff_status

model.py(app2)

class Order(models.Model):
    name = models.CharField(max_length=60)
    email = models.EmailField(max_length=60,default=None, blank=True)
    mobile_no = models.CharField(max_length=13, default=None) 
    address = models.CharField(max_length=150)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status_choices = (
        ('In Queue', 'In Queue'),
        ('Processing', 'Processing'),
        ('Ready', 'Ready'),
        ('Delivered', 'Delivered'),
        ('Paid', 'Paid'),
        ('Cancelled', 'Cancelled'),
    ) 
    status = models.CharField(max_length=15, choices=status_choices, 
            default=status_choices[0][0])
    total = models.DecimalField(max_digits=10, decimal_places=2,default=0)


class Meta:
    ordering = ('created', )


def __str__(self):
    return 'Order {}'.format(self.id)


def get_total(self):
    return sum(item.get_cost() for item in self.items.all())

Solution

  • Add a field in app2 models.py file to store the usertype in orders table:

    from app1.models import UserTypes
    
    user = models.OneToOneField(UserTypes, on_delete=models.CASCADE)
    

    Add this code to admin.py file of your app2:

    from app1.models import UserTypes
    from .models import Order
    
    class OrderAdmin(admin.ModelAdmin):
        def get_form(self, request, obj=None, **kwargs):
            form = super(OrderAdmin,self).get_form(request, obj,**kwargs)
            # form class is created per request by modelform_factory function
            # so it's safe to modify
            # we modify the the queryset
            form.base_fields['user'].queryset = 
            form.base_fields['user'].queryset.filter(staff_choices='Delivery Boy')
            return form
    admin.site.register(Order, OrderAdmin)