Соедините две модели Django

Привет! Я пытаюсь сделать сайт аукционов для проекта и не могу соединить 2 модели, которые у меня есть на странице models.py, модель для аукционных объявлений (Alisting) и модель для сделанных ставок (Bid).

Модель Alisting имеет 4 поля: "title" CharField для названия аукциона, "sta_bid" для начальной ставки, "las_bid" ForeignKey для модели Bid и user ForeignKey для User.

Модель ставки имеет 3 поля: "user" ForeignKey to User для пользователя, который делает ставку, "listing" ForeignKey to Alisting и "new_bid" IntegerField для последней ставки.

class User(AbstractUser):
    pass

class Alisting(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=32)
    sta_bid = models.IntegerField()
    las_bid = models.ForeignKey(Bid, on_delete=models.CASCADE)

class Bid(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    listing = models.ForeignKey(Alisting, on_delete=models.CASCADE)
    new_bid = models.IntegerField()

Как я могу соединить эти 2 модели, чтобы при создании объявления я мог создавать новые ставки для этого объявления из другой модели. Потому что позже в проекте мне нужно будет позволить пользователям изменять ставки в объявлениях других пользователей.

Заранее спасибо!

Я предлагаю вам такую конструкцию:

class User(AbstractUser):
    pass

class Alisting(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=32)
    sta_bid = models.IntegerField()
   
    @property
    def last_bid(self):
       # You don' t need to update last_bid, since is obtained dynamically with this property
       if self.bid_set.objects.count() > 0:
          return self.bid_set.order('-creation_date')[0]
       return None

class Bid(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    listing = models.ForeignKey(Alisting, on_delete=models.CASCADE)
    new_bid = models.IntegerField()
    creation_date = models.DateTimeField(auto_now_add=True)  # Stores the date when the bid was created

Вы можете получить доступ к последней ставке с помощью:

listing = Alisting.objects.all()[0]
print(listing.last_bid)

Вы можете получить доступ к ставкам объявления с помощью:

listing = Alisting.objects.all()[0]
listings.bid_set.objects.all()
# Or to get only bids of a given user
listings.bid_set.objects.filter(user=User.objects.all()[0])

Вы можете получить доступ к заявкам пользователя с помощью:

user = User.objects.all()[0]
user.bid_set.objects.all()
# Or to get only bids of an user with a given listing
user.bid_set.objects.filter(listing=Alisting.objects.all()[0])

Вы можете получить доступ к спискам, созданным данным пользователем с помощью:

user = User.objects.all()[0]
user.alisting_set.objects.all()
Вернуться на верх