Keiko
Keiko

Reputation: 61

Django Models: Many to Many or One to Many

I am trying to figure how to appropriately create the relationship between Order and Ticket models. The user can purchase many tickets, and with it will receive a Ticket ID--but when the User pays the amount of tickets (or ticket ID)--I want it to show the Order ID# with the Ticket ID#. However, I am unsure how to create the relationship between Ticket and Order models. Would I even need Order to be joined with Ticket models? What would you suggest? I tried using Order as many-to-many relationship with ticket, but it didn't seem to work. Suggestions would be helpful.

models.py

class User(models.Model):
    first_name=models.CharField(max_length=100)
    last_name=models.CharField(max_length=100)
    email=models.CharField(max_length=100)
    password=models.CharField(max_length=100)
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

class Ticket(models.Model):
    venue=models.CharField(max_length=100)
    quantity=models.PositiveIntegerField()
    price=models.DecimalField(default=25.00, max_digits=5, decimal_places=2, null=True, blank=True)
    loop=models.CharField(max_length=100)
    purchaser = models.ForeignKey(User, related_name="purchases", on_delete=models.PROTECT)
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

class Order(models.Model):
    full_name=models.CharField(max_length=100)
    cc_number=models.PositiveIntegerField()
    exp_date=models.PositiveIntegerField()
    cvc=models.PositiveIntegerField()
    buyers=models.ManyToManyField(Ticket, related_name="bought_tickets")-----THIS HAS BEEN DELETED
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)
    ```

Upvotes: 0

Views: 224

Answers (2)

Ben Boyer
Ben Boyer

Reputation: 1234

There is severall possibilities depending on what you want to do with this Order later on.

If the Order is ticket-based(one order per ticket sold):

  1. Ticket and Order need to have a OneToOne relationship: Each ticket will lead to only one order, and one order lead back to a ticket.
  2. So you can filter all the tickets buy by a specific user and retrieve the order like, and then access for each tickets the order:

Associated code:

user_tickets = Ticket.objects.filter(purchaser='a scpecific user_id')
for ticket in user_tickets:
     print(ticket.order.id)

If the Order are client based (One order is linked to a User and contains severall tickets) then you should add ForeignKey to User in Order and a ForeignKey to Order in ticket:

class Order(models.Model):
    ...
    buyer=models.ForeignKey(User, related_name="bought_tickets")
    ...
class Ticket(models.Model):
    purchaser = models.ForeignKey(User, related_name="purchases", on_delete=models.PROTECT)
    order = models.ForeignKey(Order)
    ...

Upvotes: 0

cwhisperer
cwhisperer

Reputation: 1926

In Order I would suggest a ForeignKey with User as well as a ForeignKey with Ticket. One User may have multiple Tickets and multiple Orders. One Order may have multiple Tickets.

Upvotes: 1

Related Questions