Max
Max

Reputation: 395

How to solve two module imports each other in Django

I have two models named as User and Newspaper. User can be author or reader and both are in the same model. So Newspaper has an author and it can create many newspapers. Reader has favorites and he can add as many newspapers as he want.

Question: How to solve circular import between two modules?

Extra info: user and newspaper are two different apps.

├── project
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── manage.py
├── newspaper
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
└── user
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    ├── migrations
    │   ├── 0001_initial.py
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

newspaper/models.py

class NewsPaper(models.Model):
    title = models.CharField(max_length=255)
    file = models.FileField(upload_to=get_file_upload_path)
    author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE,
                                            related_name="created_newspaper")

    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title[:20] + '...' if len(self.title) > 20 else self.title

user/models.py

class User(AbstractBaseUser, PermissionsMixin):
    phone_number = models.CharField(max_length=20, unique=True,
                                    validators=[validate_phone_number])
    firstname = models.CharField(max_length=255)
    lastname = models.CharField(max_length=255)

    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

    favorites = models.ManyToManyField(NewsPaper)

    objects = UserManager()

    USERNAME_FIELD = 'phone_number'

    @property
    def my_uploaded_content(self):
        return self.created_newspaper.all()

    def __str__(self):
        return f'{self.firstname} {self.lastname}'

Upvotes: 1

Views: 231

Answers (1)

weAreStarsDust
weAreStarsDust

Reputation: 2752

You can use ForeignKey without import this way:

class User(AbstractBaseUser, PermissionsMixin):
    ...
    favorites = models.ManyToManyField('newspaper.NewsPaper')
    ...

Upvotes: 2

Related Questions