Proteeti Prova
Proteeti Prova

Reputation: 1169

Django- How to use one field from one model to another model?

I have 2 models GeneralUser & UserVoteNews which uses User as foreign key. I want to add a Boolean field in the GeneralUser, and want to access it in the UserVoteNews model. How can I achieve this?

class GeneralUser(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    ban = models.BooleanField(default=True)

class UserVoteNews(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    ban = ??

Upvotes: 0

Views: 1180

Answers (2)

khadim husen
khadim husen

Reputation: 146

I would make single model for ban field. And so on

class allUser(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    ban = models.BooleanField(default=True) 


class GeneralUser(models.Model):
    user = models.ForeignKey(allUser, on_delete=models.CASCADE) 
class UserVoteNews(models.Model):
    user =models.ForeignKey(allUser, on_delete=models.CASCADE)

Upvotes: 1

ruddra
ruddra

Reputation: 52028

Instead of a field, use a property method:

# for every ban value

class UserVoteNews(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    @property
    def ban(self):
       return self.user.generaluser.values('pk', 'ban')

# for latest ban value
class UserVoteNews(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    @property
    def ban(self):
       return self.user.generaluser.last().ban

# For any ban value

class UserVoteNews(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    @property
    def ban(self):
       return self.user.generaluser.filter(ban=True).exists()

But it would be good design if you had OneToOne relation between GeneralUser and User model. Then you could simply use:

@property
def ban(self):
   return self.user.generaluser.ban

Upvotes: 1

Related Questions